Opcode |
Instruction |
Description |
---|---|---|
F6 /7 |
IDIV r/m8 |
Signed divide AX (where AH must contain sign-extension of AL) by r/m byte. (Results: AL=Quotient, AH=Remainder) |
F7 /7 |
IDIV r/m16 |
Signed divide DX:AX (where DX must contain sign-extension of AX) by r/m word. (Results: AX=Quotient, DX=Remainder) |
F7 /7 |
IDIV r/m32 |
Signed divide EDX:EAX (where EDX must contain sign-extension of EAX) by r/m doubleword. (Results: EAX=Quotient, EDX=Remainder) |
Divides (signed) the value in the AL, AX, or EAX register by the source operand and stores the result in the AX, DX:AX, or EDX:EAX registers. The source operand can be a general-purpose register or a memory location. The action of this instruction depends on the operand size, as shown in the following table:
Operand Size |
Dividend |
Divisor |
Quotient |
Remainder |
Quotient Range |
---|---|---|---|---|---|
Word/byte |
AX |
r/m8 |
AL |
AH |
-128 to +127 |
Doubleword/word |
DX:AX |
r/m16 |
AX |
DX |
-32,768 to +32,767 |
Quadword/doubleword |
EDX:EAX |
r/m32 |
EAX |
EDX |
-231 to 232 - 1 |
Non-integral results are truncated (chopped) towards 0. The sign of the remainder is always the same as the sign of the dividend. The absolute value of the remainder is always less than the absolute value of the divisor. Overflow is indicated with the #DE (divide error) exception rather than with the OF (overflow) flag.
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;
The CF, OF, SF, ZF, AF, and PF flags are undefined.
#DE - If the source operand (divisor) is 0. The signed result (quotient) is too large for the destination.
#GP(0) - If a memory operand effective address is outside the CS, DS, ES, FS, or GS segment limit. If the DS, ES, FS, or GS register is used to access memory and it contains a null segment selector.
#SS(0) - If a memory operand effective address is outside the SS segment limit.
#PF(fault-code) - If a page fault occurs.
#AC(0) - If alignment checking is enabled and an unaligned memory reference is made while the current privilege level is 3.
#DE - If the source operand (divisor) is 0.
The signed result (quotient) is too large for the destination.
#GP - If a memory operand effective address is outside the CS, DS, ES, FS, or GS segment limit.
#SS - If a memory operand effective address is outside the SS segment limit.
#DE - If the source operand (divisor) is 0.
The signed result (quotient) is too large for the destination.
#GP(0) - If a memory operand effective address is outside the CS, DS, ES, FS, or GS segment limit.
#SS(0) - If a memory operand effective address is outside the SS segment limit.
#PF(fault-code) - If a page fault occurs.
#AC(0) - If alignment checking is enabled and an unaligned memory reference is made.
For details, see Volume 2A and Volume 2B of the Intel(R) 64 and IA-32 Intel Architecture Software Developer's Manual. For the latest updates on the instruction set information, go to the web site.