我們都知道:
無符號數除法指令--格式為:
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