;不会溢出的除法(32位除16位,商如果只能是16位,则可能溢出,比如FFFFF div 1)
;因此,把商也要增大到32位
;输入参数:ax 保存被除数低16位,dx 保存被除数高16位,cx 保存除数
;输出参数:ax 保存商低16位,dx 保存商高16位,cx保存余数
;计算方法:商的高16位=被除数高16位 div 除数 的 商
; 商的低16位=((被除数高16位 div 除数 的 余数)*FFFF+被除数低16位)div 除数 的 商
; 余数=上式的余数
public divdw
segdivdw segment 'code'
divdw proc far
push bx ;保存bx
mov bx,ax ;先把低16位保存
mov ax,dx ;高16位移到低16位
mov dx,0 ;高16位置零
div cx ;除
push ax ;保存商
mov ax,bx ;取出原来保存的低16位,高16位是上次除法的余数,已经在dx里面了
div cx ;再除
mov cx,dx ;把余数保存到cx
pop dx ;把第一次除的商,放入dx,作为结果的高16位
pop bx ;恢复bx
ret ;返回
divdw endp
segdivdw ends
end