测试AL中的ASCII值为“0 - 9”范围内的数字[程序集X86]

时间:2014-02-27 20:43:29

标签: assembly x86 masm irvine32

我是汇编语言的新手,当我编写一个程序来测试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

请告诉我我犯了哪些错误,以便纠正错误。感谢。

1 个答案:

答案 0 :(得分:1)

我看到了几个错误:

  1. 您声明了DWORD元素的数组,但EDI和ESI在每次迭代时仅增加1个字节;如果我是你,我会使用字节数组。
  2. 输入数组元素是文字数字,而不是字符,因此它们都不会按原样匹配;尝试将其中一个元素更改为'4'而不是4以查看差异。
  3. 您希望WriteString打印一个DWORD元素数组,这些元素不是字符串,并且您从未指定过该字符串。
  4. 对于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