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
用于检查char是号码还是输入密钥。
最初bx
为0。
push '@'
用于检查堆栈的结尾。
我拿了单位数字并将其转换为其位置值。然后我做了他们的加法,将它们放在堆栈上,并试图显示它们。在某些PC中,它显示"分隔溢出"。
我不知道我在哪里错了!请帮助我逻辑。
问题
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的值! - a 单词大小 distrive使用
DX:AX
作为股息。由于您的号码仅1个字,因此您需要将其放入AX
中,而DX
中的高部分为零。 - 当您执行单词大小时,商将在
AX
中。那么您不应该检查AH
登记册! - 由于需要推动其余部分,因此无助于编写
push ax
。使用push dx
。 - ...
解决方案
您肯定应该看看这篇最近的帖子显示数字。
您会发现您需要做什么的完美解释。
它甚至使用相同的技术来推动堆栈上的一些价值来了解数字在哪里结束。
您必须在划分之前清除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