2014-02-27 59 views
0

我是新來的彙編語言,而我是編寫一個程序,測試AL中的ASCII值是範圍「0 - 9」,我想我犯了一些邏輯錯誤。測試AL中作爲範圍爲「0 - 9」的數字的ASCII值[Assembly X86]

另外,我必須通過設置/清除Z標誌返回true/false。我知道如何設置/清除進位標誌,但我沒有設置/清零標誌。

我試圖尋找幫助,但我完全失去了這個東西。這是我迄今爲止所做的。

Include Irvine32.inc 

.data 
Array1 BYTE 0,1,2,3,'4',11,7,8,9,10 
buff BYTE 10 dup(?) 

.code 
main PROC 
Call Clrscr 
Mov esi, Offset Array1 
Mov edi, Offset buff 
Mov ecx, LengthOf Array1 
L1: 
Mov AL,[ESI] 
Call ASCII_Test 
JNC No 
Mov [EDI],AL 
INC EDI 
No: 
INC ESI 
Loop L1 
Call CRLF 
Mov edx, Offset buff 
Call WriteString 
Call CRLF 
Exit 
Main ENDP 

ASCII_Test PROC 
CMP AL,'0' 
JB No 
CMP AL,'9' 
JA No 
STC 
RET 
No: 
CLC 
RET 
ASCII_Test ENDP 

END main 

請告訴我我犯了什麼錯誤,以便我可以糾正它們。謝謝。

+0

測試,看是否在AL值是十六進制30和六角39. [鏈接](HTTP之間://www.asciitable.com/) – jeff

回答

1

我看到幾個錯誤:

  1. 你宣佈DWORD元素的數組,但EDI和ESI只被在每次迭代增加1個字節;如果我是你,我會使用字節數組。
  2. 輸入數組元素是字面數字,而不是字符,因此它們都不會匹配;嘗試將其中一個元素更改爲「4」而不是4,以查看其差異。
  3. 您希望WriteString可以打印DWORD元素的數組,該元素不是字符串,並且您從未指定長度。

至於ZF,沒有專門的指令來設置和清除它(因爲它與CF和一些其他標誌,如IF和DF)。但是,您應該知道您使用的cmp指令會修改標誌,因此當您使用jbja檢查標誌併發生跳轉時,可以確定ZF未設置(請參閱表here)。另一方面,如果跳躍沒有發生,則ZF可以處於任一狀態(在第二次比較後,如果AL等於'9',則ZF將爲1,否則爲0),因此您需要手動設置它。你可以在許多方面實現這一點,只是給你一個簡單的例子,這會做的很好:

cmp al, al ; as AL equals itself, ZF would be set after this instruction is executed 
+0

非常感謝您的幫助。現在它工作正常。 @ mike.dld –

+0

剛剛看到你分享的鏈接,它真的幫助我瞭解ZF和CF.所以再次感謝您的幫助。我很感激:) @ mike.dld –