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