公式来源于王爽老师汇编语言一书
公式如下: X/n=int(H/n)*65536+[rem(H/n)*65536+L]/n
X[0,FFFFFFFF] 被除数
n[0,FFFF] 除数 CX
H[0,FFFF] 高16位 DX
L[0,FFFF] 低16位 AX
总结一下就是简单强大,将一个除法运算转化成二个不会造成溢出的除法运算,关键就是二次不溢出,那么就可以第一次除法的商左移16位,第二次除法运算的商数就是低16位的值,余数就是X/N的余数.
1,int(H/n)*65536
相当于:
mov bx,ax ;低16位转存
mov ax,dx
mov dx,0
div cx
因为第二个除法不会造成溢出,所以这步得出的商就是最后高16位的商值,可以将商AX转存或入栈
2,[rem(H/n)*65536+L]/n
第一步运算得出的余数在DX中,那么直接用第一步中存入BX中的值存入AX中,就是rem(H/n)*65536+L了
具体代码摘自网上:
;*************************************************
;计算参数:
;ax=被除数低16位
;dx=被除数高16位
;cx=除数
;计算结果返回参数:
;ax=结果商的低16位
;dx=结果商的高16位
;cx=结果的余数
;*************************************************
divdw:push bx
mov bx,ax
mov ax,dx
mov dx,0
div cx
push ax
mov ax,bx
div cx
mov cx,dx
pop dx
pop bx
ret
;*************************************************
;计算参数:
;进入子程序时,栈顶IP,后面依次被除数低16位,高16位,除数
;计算结果返回参数:
;被除数低16位,高16位存放商高16位,低16位
;除数位存放余数
;*************************************************
divdw:
push bp
mov bp,sp
mov ax,[bp+6]
mov dx,0
div word ptr [bp+8]
mov bx,ax
mov ax,[bp+4]
div word ptr [bp+8]
mov [bp+8],dx
mov [bp+6],bx
mov [bp+4],ax
pop bp
ret