【问题标题】:Addition of 2-digit numbers using stack使用堆栈添加 2 位数字
【发布时间】:2017-09-06 17:37:28
【问题描述】:
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 '@' 用于检查堆栈结束。

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

我不知道我错在哪里!请帮我解释一下逻辑。

【问题讨论】:

  • 它应该做除法溢出,这就是DIV r16的定义。检查指令参考指南。 (例如,您可以从一些 HTML 变体开始,如果您不喜欢完整的英特尔文档:x86.renejeschke.de

标签: assembly x86-16 emu8086


【解决方案1】:

问题

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 在此sn-p 开始时将保持10,但此时它的值将是010Dh!
  • 字大小除法使用DX:AX 作为被除数。由于您的号码只有 1 个字,因此您需要将其放入 AX并将 DX 中的高位归零。
  • 当您执行 字大小 除法时,商将在 AX 中。那么你不应该检查AH 寄存器!
  • 由于需要推送的是余数,所以写push ax 也无济于事。使用push dx
  • ...

解决方案

你绝对应该看看这篇最近的帖子 Displaying numbers with DOS.

您会在其中找到对您需要做什么的完美解释。
它甚至使用相同的技术将一些值压入堆栈以了解数字的结束位置。

【讨论】:

    【解决方案2】:

    你必须在除法之前清除 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
    

    【讨论】:

      猜你喜欢
      • 2021-04-15
      • 2018-09-10
      • 2011-12-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-06-15
      • 2012-03-16
      • 1970-01-01
      相关资源
      最近更新 更多