IDIV - 有符號除法

操作碼

指令

說明

F6 /7

IDIV r/m8

將有符號 AX(其中 AH 必須包含 AL 的符號擴充套件)除以有符號 r/m 位元組。(結果:AL = 商,AH = 餘數)

F7 /7

IDIV r/m16

將有符號 DX:AX(其中 DX 必須包含 AX 的符號擴充套件)除以有符號 r/m 字。(結果:AX = 商,DX = 餘數)

F7 /7

IDIV r/m32

將有符號 EDX:EAX(其中 EDX 必須包含 EAX 的符號擴充套件)除以有符號 r/m 雙字。(結果:EAX = 商,EDX = 餘數)

說明

將 AL、AX 或 EAX 暫存器中的值除以(有符號)源運算元,結果儲存到 AX、DX:AX 或 EDX:EAX 暫存器。源運算元可以是通用暫存器或記憶體位置。此指令的操作取決於運算元大小,具體如下表所示:

運算元大小

被除數

除數

餘數

商的範圍

字/位元組

AX

r/m8

AL

AH

-128 到 +127

雙字/字

DX:AX

r/m16

AX

DX

-32,768 到 +32,767

四字/雙字

EDX:EAX

r/m32

EAX

EDX

-231 到 232 - 1

非整型結果會向 0 截斷(去尾)。餘數的符號總是與被除數的相同。餘數的絕對值總是小於除數的絕對值。上溢使用 #DE(除法錯誤)異常表示,而不是使用 OF(上溢)標誌。

操作

IF SRC 0
THEN #DE; (* divide error *)
FI;
IF OpernadSize 8 (* word/byte operation *)
THEN
temp AX / SRC; (* signed division *)
IF (temp > 7FH) OR (temp < 80H)
(* if a positive result is greater than 7FH or a negative result is less than 80H *)
THEN #DE; (* divide error *) ;
ELSE
AL temp;
AH AX SignedModulus SRC;
FI;
ELSE
IF OpernadSize 16 (* doubleword/word operation *)
THEN
temp DX:AX / SRC; (* signed division *)
IF (temp > 7FFFH) OR (temp < 8000H)
(* if a positive result is greater than 7FFFH *)
(* or a negative result is less than 8000H *)
THEN #DE; (* divide error *) ;
ELSE
AX temp;
DX DX:AX SignedModulus SRC;
FI;
ELSE (* quadword/doubleword operation *)
temp EDX:EAX / SRC; (* signed division *)
IF (temp > 7FFFFFFFH) OR (temp < 80000000H)
(* if a positive result is greater than 7FFFFFFFH *)
(* or a negative result is less than 80000000H *)
THEN #DE; (* divide error *) ;
ELSE
EAX temp;
EDX EDXE:AX SignedModulus SRC;
FI;
FI;
FI;

影響的標誌

CF、OF、SF、ZF、AF 及 PF 標誌未定義。

保護模式異常

#DE - 如果源運算元(除數)是 0。有符號結果(商)對於目標位置而言太大。

#GP(0) - 如果記憶體運算元有效地址超出 CS、DS、ES、FS 或 GS 段限制。如果 DS、ES、FS、或 GS 暫存器用於訪問記憶體,並且它包含空的段選擇器。

#SS(0) - 如果記憶體運算元有效地址超出 SS 段限制。

#PF(錯誤程式碼) - 如果發生頁錯誤。

#AC(0) - 如果啟用對齊檢查並在目前特權級別為 3 時進行未對齊的記憶體引用。

實地址模式異常

#DE - 如果源運算元(除數)為 0。

有符號結果(商)對於目標而言太大。

#GP - 如果記憶體運算元有效地址超出 CS、DS、ES、FS 或 GS 段限制。

#SS - 如果記憶體運算元有效地址超出 SS 段限制。

虛 8086 模式異常

#DE - 如果源運算元(除數)為 0。

有符號結果(商)對於目標而言太大。

#GP(0) - 如果記憶體運算元有效地址超出 CS、DS、ES、FS 或 GS 段限制。

#SS(0) - 如果記憶體運算元有效地址超出 SS 段限制。

#PF(錯誤程式碼) - 如果發生頁錯誤。

#AC(0) - 如果在啟用對齊檢查的情況下進行未對齊的記憶體引用。