汇编 大家看一下错在哪里?

来源:百度知道 编辑:UC知道 时间:2024/05/17 22:16:07
键盘输入3个数,然后相加并输出结果

DATAS SEGMENT
buf db 10 dup(?)
sum db ?
DATAS ENDS
CODES SEGMENT
ASSUME CS:CODES,DS:DATAS
START:
MOV AX,DATAS
MOV DS,AX
xor ax,ax
lea bx,buf
mov cx,3
loa:mov ah,01h
sub al,30h
mov [bx],al
int 21h
add bx,1
loop loa
mov al,buf
mov bl,buf+1
mov dl,buf+2
add al,bl
add al,dl
mov sum,al
mov ah,02h
mov dl,13
int 21h
mov ah,02h
mov dl,10
int 21h
mov ah,02h
mov dl,sum
add dl,30h
int 21h
MOV AH,4CH
INT 21H
CODES ENDS
END START
程序运行后查看内存单元看到数据是从buf+1开始存,而buf单元出现莫名其妙的字符

loa:mov ah,01h
sub al,30h
mov [bx],al
int 21h
add bx,1
loop loa

这段代码有错,你想想看,程序第一次执行到这里的时候 al=0,还没有存入键盘输入的数字就被你减去30H并存入内存了只要调整下顺序就可以了:
loa:
mov ah,01h
int 21h ;此时al被赋值
sub al,30h
mov [bx],al
add bx,1
loop loa
我亲自调试过,结果正确,如果不给分就不厚道了~

毛病主要出在这里:
loa:mov ah,01h
sub al,30h
mov [bx],al
int 21h
add bx,1
loop loa

给你改一下,下面的相加及输出结果,暂不考虑。
loa:mov ah,01h
int 21h
and al,0fh
mov [bx],al
inc bx
loop loa

loa:mov ah,01h
sub al,30h
mov [bx],al
int 21h
add bx,1
loop loa
以上的代码不会造成死循环吗?