2013-05-12 72 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字符。