公式來源於王爽老師彙編語言一書
公式如下: 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