为什么 mov dx,0 修复了这个除法程序?

ady*_*ady 1 x86 assembly dos

一个简单的循环来找到最大的除数,这将是根的整数,在这种情况下,在 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
Run Code Online (Sandbox Code Playgroud)

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

将 mov dx,0 放入修复它并使事情恢复正常

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

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

Kyu*_*rem 5

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

DX 是上位词。AX 是下位词。因此,如果您想将 AX 除以 BX,您需要将 DX 归零。