組合語言下--如何防止除法溢位

weixin_34391854發表於2014-11-18

我們都知道:

 無符號數除法指令--格式為:

DIV mem/reg8 ; AH餘數,AL商← AX / mem/reg8

DIV mem/reg16 ; DX餘數,AX商← DX:AX / mem/reg8

與被除數和除數一樣,商和餘數也都為無符號數。DIV 指令執行後,所有標誌均無定義。

整數除法指令--格式為:

IDIV mem/reg8 ; AX ← AX / mem/reg8
IDIV mem/reg16 ; DX:AX ← DX:AX / mem/reg16

對DIV和IDIV指令,如果位元組操作時,被除數的高8 位絕對值大於除數的絕對值,或在字操作時,被除數的高16 位絕對值大於除數的絕對值,就會產生溢位,也就是說結果(商)超過了目標暫存器AL 或AX 所能存放數的範圍。
結果溢位時,計算機會自動產生一箇中斷型別號為0的除法錯中斷,相當於執行了除數為0的運算,所得的商和餘數都不確定。
對於無符號數,位元組操作時,允許最大商為FFH,字操作時最大商為FFFFH,若超過這個範圍就會溢位。對於帶符號數,位元組操作時商的範圍為-127~+127,字操作時商的範圍為-32767~ +32767。

 

但如果所得結果太大時,就會出現溢位:如DX:AX(12345678H) / BX(11H)   

當作除法動作所得商大於AX所能儲存的位元組範圍時,就會溢位。

解決辦法是:

;DX:AX(12345678H) / BX(11H)  
        MOV BX,11H     ;BX為除數
        MOV DX,5678H   ;DX存高位
        MOV AX,1234H   ;AX存低位
        MOV DI,AX      ;先儲存好低位
                        
                        ;先計算高位,所得商AX即為最後商的高位
                        ;         所得餘DX即為接下來低位運算的DX
        MOV AX,DX
        MOV DX,0
        DIV BX
                        ;再計算低位,所得商AX即為最後商的低位
                        ;          所得餘DX即為最後的餘
        MOV AX,DI
        DIV BX 
         

 

相關文章