匯編語言下--如何防止除法溢出


我們都知道:

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

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 
         

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM