本实验要实现32位除法结果不溢出(被除数32位,除数16位)
assume cs:code
code segment
start :
mov ax , 4240H //参数1:被除数的低16位,放入ax
mov dx , 000FH //参数2:被除数的高16位,放入dx
mov cx , 0AH //参数3: 除数,放入cx
call divdw //调用函数 divdw,传入参数1,2,3
mov ax , 4c00H
int 21H
divdw: //32位不溢出除法函数,函数中用到的局部变量保存在bx,si中,所以要先保存bx,si的原始值
push bx
push si
mov bx , ax //将被除数的低16位保存到局部变量
mov ax , dx //将被除数高位移到低位
sub dx , dx //被除数高位清0
div cx //调用div指令进行32位除法运算,这个结果不会溢出,因为被除数的高16位现在为0
mov si , ax //div的商保存在ax,因为接下来还要进行一次div,所以把这个商保存的局部变量,这个值实际上构成最终的商的高16位
mov ax , bx //将原被除数的低16位还原到ax中
div cx //再次进行div调用,这回dx中保存的是第一次div后的余数,dx现在一定小于除数,所以这回的除法也不会溢出
mov cx , dx //第二次div的余数构成最终的余数,保存到cx
mov dx , si //最终的商的高位从局部变量还原回来,而最终的商的低16位就是第二次div的商,正好保存在ax中,不用改变
pop si
pop bx
ret //函数返回
code ends
end start