【问题标题】:Why did mov dx,0 fix this division routine?为什么 mov dx,0 修复了这个除法例程?
【发布时间】:2013-05-16 22:48:15
【问题描述】:

找到最大除数的简单循环,即根的整数,在这种情况下,在 345 三角形中的 5 处退出

mov ax,3                        
mul ax                          
push ax                         
mov ax,4                        
mul ax                          
pop bx                          
add ax,bx                       
push ax    ;save 25 decimal for repeated loops                        
mov bx,1                        
mov bp,sp                       

agin                            
mov dx,0      ;fixed problem                  
mov ax,[bp]   ;25 decimal                  
inc bx        ;starts at 2                  
div bx                          
cmp bx,ax                       
jb agin                         

out

但是,当程序从 2 变为 3 时发生了奇怪的事情,我得到的是 hex555D 而不是 8 (8*3)

将 mov dx,0 放入修复并恢复正常

我不知道为什么,标志没有改变

有人知道为什么吗?这是一个签名/未签名的问题吗?

【问题讨论】:

    标签: assembly x86 dos


    【解决方案1】:

    DIV 指令将数字 DX:AX 除以操作数。

    DX 是高位词。 AX 是较低的单词。因此,如果你想用 AX 除以 BX,你需要将 DX 归零。

    【讨论】:

    • 干杯。我从来不知道前一个除法的其余部分可以做到这一点,(所以它的工作原理就像 16 位模式下的 32 位操作)
    • 这也是为什么有“CWD”指令的原因!它有助于支持这些大型拆分寄存器操作。
    猜你喜欢
    • 2013-11-14
    • 2012-04-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-15
    相关资源
    最近更新 更多