汇编语言的编程时遇到的问题,急!急!急!急!急!

来源:百度知道 编辑:UC知道 时间:2024/07/01 02:27:30
看下面的程序,数据区5个数都是0的话就运行正常显示5个2,但是像是我下面修改的第二个数改成2后为什么什么都不显示了?????至少应该显示一个2啊!!!!
DATAS SEGMENT
BUF DB 0,2,0,0,0
N EQU $-BUF
MAX DB ?
MIN DB ?
DATAS ENDS
STACKS SEGMENT
STACKS ENDS
CODES SEGMENT
ASSUME CS:CODES,DS:DATAS,SS:STACKS
START:
MOV AX,DATAS
MOV DS,AX
MOV SI,OFFSET BUF
MOV CX,N
LOOP1:CMP [SI],0
JZ LAB1
JMP OK
LAB1: MOV DL,32H
MOV AH,2
INT 21H
INC SI
LOOP LOOP1
OK:MOV AH,4CH
INT 21H
;
CODES ENDS
END START

问题出在这行: CMP [SI],0
应该指定[SI]的属性。你没有指定属性,所以有时候作字(16位)处理,有时候作字节(8位)处理,当它作字处理时就不显示任何东西了,因为第一个字为0200H。
所以该行应该改为如下:

CMP BYTE PTR [SI],0

这样就指定了[SI]的属性为字节(8位)。

按照你写的程序实现的功能是:
对于缓冲区的数,如果是0就输出2,接着判断下一数字是否为0,如果为0就继续输出2并继续读下一字符,否则跳出循环返回DOS
对于0,2,0,0,0正确的输出应为2
只需将[SI]改为BUF[SI]即可