我是汇编语言的新手,当我编写一个程序来测试AL中的ASCII值作为“0 - 9”范围内的数字时,我想我犯了几个逻辑错误
此外,我必须通过设置/清除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 :(得分:1)
我看到了几个错误:
WriteString
打印一个DWORD元素数组,这些元素不是字符串,并且您从未指定过该字符串。对于ZF,没有专门的指令来设置和清除它(因为它与CF和其他几个标志如IF和DF一样)。然而,您应该知道您正在使用的cmp
指令会修改标志,因此当您使用jb
和ja
检查标志并发生跳转时,您可以确定ZF未设置(见表here)。如果另一方面没有发生跳转,ZF可能处于任一状态(经过第二次比较,如果AL等于'9',ZF将为1,否则为0),因此您需要手动设置它。您可以通过多种方式实现这一目标,但只是为了给您一个简单的示例,这样做会很好:
cmp al, al ; as AL equals itself, ZF would be set after this instruction is executed