IMUL--Signed Multiply

Opcode

Instruction

Description

F6 /5

IMUL r/m8

AX AL * r/m byte

F7 /5

IMUL r/m16

DX:AX AX * r/m word

F7 /5

IMUL r/m32

EDX:EAX EAX * r/m doubleword

0F AF /r

IMUL r16,r/m16

word register word register * r/m word

0F AF /r

IMUL r32,r/m32

doubleword register doubleword register * r/m doubleword

6B /r ib

IMUL r16,r/m16,imm8

word register r/m16 * sign-extended immediate byte

6B /r ib

IMUL r32,r/m32,imm8

doubleword register r/m32 * sign-extended immediate byte

6B /r ib

IMUL r16,imm8

word register word register * sign-extended immediate byte

6B /r ib

IMUL r32,imm8

doubleword register doubleword register * sign-extended immediate byte

69 /r iw

IMUL r16,r/

m16,imm16

word register r/m16 * immediate word

69 /r id

IMUL r32,r/

m32,imm32

doubleword register r/m32 * immediate doubleword

69 /r iw

IMUL r16,imm16

word register r/m16 * immediate word

69 /r id

IMUL r32,imm32

doubleword register r/m32 * immediate doubleword

Description

Performs a signed multiplication of two operands. This instruction has three forms, depending on the number of operands.

One-operand form. This form is identical to that used by the MUL instruction. Here, the source operand (in a general-purpose register or memory location) is multiplied by the value in the AL, AX, or EAX register (depending on the operand size) and the product is stored in the AX, DX:AX, or EDX:EAX registers, respectively.

Two-operand form. With this form the destination operand (the first operand) is multiplied by the source operand (second operand). The destination operand is a general-purpose register and the source operand is an immediate value, a general-purpose register, or a memory location. The product is then stored in the destination operand location.

Three-operand form. This form requires a destination operand (the first operand) and two source operands (the second and the third operands). Here, the first source operand (which can be a general-purpose register or a memory location) is multiplied by the second source operand (an immediate value). The product is then stored in the destination operand (a general-purpose register).

When an immediate value is used as an operand, it is sign-extended to the length of the destination operand format.

The CF and OF flags are set when significant bits are carried into the upper half of the result. The CF and OF flags are cleared when the result fits exactly in the lower half of the result.

The three forms of the IMUL instruction are similar in that the length of the product is calculated to twice the length of the operands. With the one-operand form, the product is stored exactly in the destination. With the two- and three- operand forms, however, result is truncated to the length of the destination before it is stored in the destination register. Because of this truncation, the CF or OF flag should be tested to ensure that no significant bits are lost.

The two- and three-operand forms may also be used with unsigned operands because the lower half of the product is the same regardless if the operands are signed or unsigned. The CF and OF flags, however, cannot be used to determine if the upper half of the result is non-zero.

Operation

IF (NumberOfOperands 1)
THEN IF (OperandSize 8)
THEN
AX AL * SRC (* signed multiplication *)
IF ((AH 00H) OR (AH FFH))
THEN CF 0; OF 0;
ELSE CF 1; OF 1;
FI;
ELSE IF OperandSize 16
THEN
DX:AX AX * SRC (* signed multiplication *)
IF ((DX 0000H) OR (DX FFFFH))
THEN CF 0; OF 0;
ELSE CF 1; OF 1;
FI;
ELSE (* OperandSize 32 *)
EDX:EAX EAX * SRC (* signed multiplication *)
IF ((EDX 00000000H) OR (EDX FFFFFFFFH))
THEN CF 0; OF 0;
ELSE CF 1; OF 1;
FI;
FI;
ELSE IF (NumberOfOperands 2)
THEN
temp DEST * SRC (* signed multiplication; temp is double DEST size*)
DEST DEST * SRC (* signed multiplication *)
IF temp DEST
THEN CF 1; OF 1;
ELSE CF 0; OF 0;
FI;

ELSE (* NumberOfOperands 3 *)
DEST SRC1 * SRC2 (* signed multiplication *)
temp SRC1 * SRC2 (* signed multiplication; temp is double SRC1 size *)
IF temp DEST
THEN CF 1; OF 1;
ELSE CF 0; OF 0;
FI;
FI;
FI;

Flags Affected

For the one operand form of the instruction, the CF and OF flags are set when significant bits are carried into the upper half of the result and cleared when the result fits exactly in the lower half of the result. For the two- and three-operand forms of the instruction, the CF and OF flags are set when the result must be truncated to fit in the destination operand size and cleared when the result fits exactly in the destination operand size. The SF, ZF, AF, and PF flags are undefined.

Protected Mode Exceptions

#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.

Real-Address Mode Exceptions

#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.

Virtual-8086 Mode Exceptions

#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.