8086_除法溢出

公式來源於王爽老師彙編語言一書

公式如下:    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

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章