Assembly 测试AL中的ASCII值是否为范围为“;0–;9”;[汇编X86]
我对汇编语言不熟悉,当我编写一个程序测试AL中的ASCII值是否为“0–9”范围内的数字时,我想我犯了一些逻辑错误 此外,我还必须通过设置/清除Z标志返回真/假。我知道如何设置/清除进位标志,但我以前没有设置/清除过零位标志 我试着四处寻找帮助,但这件事让我完全不知所措。这是我到目前为止所做的Assembly 测试AL中的ASCII值是否为范围为“;0–;9”;[汇编X86],assembly,x86,masm,irvine32,Assembly,X86,Masm,Irvine32,我对汇编语言不熟悉,当我编写一个程序测试AL中的ASCII值是否为“0–9”范围内的数字时,我想我犯了一些逻辑错误 此外,我还必须通过设置/清除Z标志返回真/假。我知道如何设置/清除进位标志,但我以前没有设置/清除过零位标志 我试着四处寻找帮助,但这件事让我完全不知所措。这是我到目前为止所做的 Include Irvine32.inc .data Array1 BYTE 0,1,2,3,'4',11,7,8,9,10 buff BYTE 10 dup(?) .code main PROC C
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
请告诉我我犯了什么错误,这样我才能改正。谢谢。我看到几个错误:
WriteString
打印DWORD元素数组,该数组不是字符串,并且从未指定其长度cmp
指令会修改标志,因此,当您随后使用jb
和ja
检查标志并发生跳转时,可以确保未设置ZF(请参阅表)。另一方面,如果没有发生跳转,ZF可能处于任一状态(第二次比较后,如果AL等于'9',ZF将为1,否则为0),因此您需要手动设置它。您可以通过多种方式实现这一点,但仅举一个简单的例子,这将很好:
cmp al, al ; as AL equals itself, ZF would be set after this instruction is executed
测试AL中的值是否在十六进制30和39之间。非常感谢你的帮助。现在很好用@mike.dldJust看到了您共享的链接,它确实帮助我理解了ZF和CF。再次感谢您的帮助。我很感激:)@mike.dld