Assembly 测试AL中的ASCII值是否为范围为“;0–;9”;[汇编X86]

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

我对汇编语言不熟悉,当我编写一个程序测试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
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

请告诉我我犯了什么错误,这样我才能改正。谢谢。

我看到几个错误:

  • 您声明了DWORD元素的数组,但EDI和ESI在每次迭代中仅增加1字节;如果我是你,我会使用字节数组
  • 输入数组元素是文字数字,而不是字符,因此它们都不会按原样匹配;尝试将其中一个元素更改为“4”而不是“4”,以查看差异
  • 您希望
    WriteString
    打印DWORD元素数组,该数组不是字符串,并且从未指定其长度
  • 至于ZF,没有专门的指令来设置和清除它(CF和一些其他标志,如IF和DF)。但是,您应该知道,您使用的
    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