2013-05-12 48 views
0

我在获取用户传入的字符串中的大写字母数量方面存在一些问题。我必须用masm写它。我的问题是我可以使用:获取大写字母MASM x86

AND al, some bitstream 
;TO DO LOGIC HERE 

只能得到大写字母吗?我的代码正确地得到了小写字母的数量,我似乎无法找出大写字母。此外,该字符串中还包含一些随机字符,如:(<)>?$#@ &。这样简单吗?还是我需要更多的逻辑来完成这个?

这样的事情?

jmp getNext   
getNext: mov al,[esi] 
    cmp al,0 
    je exitProc ;exit loop 
    cmp al,'a' 
     jl noChange ;increases my counters 
     cmp al,'z' 
     jle toUpperCase ;counts lowercase 
     cmp AL,'A' 
     jl noChange 
     cmp AL,'Z' 
     jg noChange 
     jl toCount ;counts uppercase 

我不断收到0作为我的答案,不知道为什么。我显然很受MASM的挑战。

看来我的toCount永远不会被调用。相反,行:

  cmp AL,'A' 
     jl noChange 
     cmp AL,'Z' 
     jl toCount ;counts uppercase 

似乎只调用noChange。这导致toCount中的值增加,永远不会被调用。我仍然无法弄清楚这有什么问题。它与小写字母的测试是完全一样的,除了在cmp中使用captial字母。

+0

为什么不检查'A'<= AL <='Z''? (即一对CMP和有条件跳转) – Michael 2013-05-12 14:40:06

+0

我还没有尝试过。你能详细解释cmp al,'A'和cmp al,'Z'究竟是做什么的吗?它如何确保它在A-Z范围内? – tmaxxcar 2013-05-12 14:48:00

+1

'CMP'本身并不能确保。但你可以做'CMP AL','A'/'JL not_capital' /'CMP AL,'Z'' /'JG not_capital'。如果没有这些跳转,你会知道'AL'在'A..Z'范围内。 – Michael 2013-05-12 14:50:35

回答

2

什么需要做的是以下几点:

cmp al,'A' 
    jl noChange ;inc counter 
    cmp al,'Z' 
    jle toCount ;count uppercase 
    cmp al,'a' 
    jl noChange ;inc counter 
    cmp al,'z' 
    jle toUpperCase ;count lowercase 

在ASCII 'A'= 65 'Z'= 90 'A'= 97 'Z'= 122.我的问题是,我首先测试了较高的ASCII字符,这会忽略65-90(AZ)中的任何ASCII字符。