使用堆栈添加2位数字

时间:2017-09-06 17:37:28

标签: assembly x86-16 emu8086

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 '@'用于检查堆栈结束。

我已经取了一位数字并将它们转换为它们的位置值。然后我完成了他们的添加,将它们放在堆栈上并尝试显示它们。在某些电脑中,它显示"除了溢出"。

我不知道我哪里错了!请帮我解释逻辑。

2 个答案:

答案 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