model small
.stack 50
.data
msg db 10,13,"data is stored in $"
msg1 db 10,13,"enter second number $"
num1 dw ?
num2 dw ?
.code
.startup
mov bl,0
mov ah,09
lea dx,msg
int 21h
mov bx,0
read :
mov ah,01h
;input number
int 21h
cmp al,13
je second
mov cl,al
mov ch,0
sub cl,48
converts ascii value
mov ax,10
mul bx
mov bx,ax
add bx,cx
jmp read
second:
mov num1,bx
mov bx,0
mov ah,09h
mov dx,offset msg1
int 21h
read1:
mov ah,01h
int 21h
cmp al,13
je aedd
mov cl,al
mov ch,0
sub cl,48
mov ax,10
mul bx
add bx,cx
jmp read1
aedd:
add bx,num1
push '@'
disp:
mov dx,ax
mov ax,bx
mov bx,dx
div bx
cmp ah,0
je poppy
push ax
jmp disp
poppy:
pop dx
cmp dx,'@'
je exit
mov ah,02h
int 21h
exit:
mov ah,04ch
mov al,0
int 21h
end
cmp al,13
用于检查字符是数字还是输入密钥
最初bx
为0
push '@'
用于检查堆栈结束。
我已经取了一位数字并将它们转换为它们的位置值。然后我完成了他们的添加,将它们放在堆栈上并尝试显示它们。在某些电脑中,它显示"除了溢出"。
我不知道我哪里错了!请帮我解释逻辑。
答案 0 :(得分:2)
mov ax,10 mul bx add bx,cx jmp read1
当您获得第二个号码时,您忘记将产品实际放回BX
。在计算第一个数字时,您已正确执行此操作。
mov ax,10
mul bx
mov bx,ax <<<<<< Add this line
add bx,cx
jmp read1
disp: mov dx,ax mov ax,bx mov bx,dx div bx cmp ah,0 je poppy push ax jmp disp
这里有很多不妥之处:
AX
在此片段的开头会保留10,但此时它的值为010Dh! DX:AX
作为分红。由于您的号码只有一个字,因此您需要将其放在AX
中,并将DX
中的高位归零。 AX
。那么你不应该检查AH
注册! push ax
。使用push dx
。 你绝对应该看看这篇最近的帖子 Displaying numbers with DOS
你会发现你需要做的完美解释。
它甚至使用相同的技术在堆栈上推送一些值来知道数字的结束位置。
答案 1 :(得分:0)
你必须在除法之前清除dx寄存器,这就是导致除法溢出的原因。
disp:
mov dx,ax
mov ax,bx
mov bx,dx
mov dx, 0 <---- this has to be added
div bx
cmp ah,0
je poppy
push ax
jmp disp