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

Assembly 为什么mov dx,0修复了这个除法例程?,assembly,x86,dos,Assembly,X86,Dos,一个查找最大除数的简单循环,该除数是根的整数,在本例中,在345三角形中,除数为5 mov ax,3 mul ax push ax mov ax,4 mul ax pop bx add ax,bx

一个查找最大除数的简单循环,该除数是根的整数,在本例中,在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放入修复状态并恢复正常

我不知道为什么,没有旗帜改变


有人知道为什么吗?这是有符号/无符号问题吗?

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


DX是上面的单词。AX是较低的词。因此,如果要将AX除以BX,则需要将DX归零。

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


DX是上面的单词。AX是较低的词。因此,如果要将AX除以BX,则需要将DX归零。

干杯。我从来不知道以前除法的剩余部分可以做到这一点(因此它在16位模式下的工作方式类似于32位操作),这也是为什么会有“CWD”指令的原因!它有助于支持这些大型拆分寄存器操作。干杯。我从来不知道以前除法的剩余部分可以做到这一点(因此它在16位模式下的工作方式类似于32位操作),这也是为什么会有“CWD”指令的原因!它有助于支持这些大型拆分寄存器操作。