IMUL - 有符號乘法

操作碼

指令

說明

F6 /5

IMUL r/m8

AX AL * r/m 位元組

F7 /5

IMUL r/m16

DX:AX AX * r/m

F7 /5

IMUL r/m32

EDX:EAX EAX * r/m 雙字

0F AF /r

IMUL r16,r/m16

字暫存器 字暫存器 * r/m

0F AF /r

IMUL r32,r/m32

雙字暫存器 雙字暫存器 * r/m 雙字

6B /r ib

IMUL r16,r/m16,imm8

字暫存器 r/m16 * 符號擴充套件的立即數位元組

6B /r ib

IMUL r32,r/m32,imm8

雙字暫存器 r/m32 * 符號擴充套件的立即數位元組

6B /r ib

IMUL r16,imm8

字暫存器 字暫存器 * 符號擴充套件的立即數位元組

6B /r ib

IMUL r32,imm8

雙字暫存器 雙字暫存器 * 符號擴充套件的立即數位元組

69 /r iw

IMUL r16,r/

m16,imm16

字暫存器 r/m16 * 立即數字

69 /r id

IMUL r32,r/

m32,imm32

雙字暫存器 r/m32 * 立即數雙字

69 /r iw

IMUL r16,imm16

字暫存器 r/m16 * 立即數字

69 /r id

IMUL r32,imm32

雙字暫存器 r/m32 * 立即數雙字

說明

對兩個有符號運算元執行乘法。根據運算元的數量,此指令有三種形式。

單運算元形式。此形式與 MUL 指令使用的形式完全相同。這裡,源運算元(位於通用暫存器或記憶體位置)乘以 AL、AX 或 EAX 暫存器(取決於運算元大小)中的值,乘積分別儲存到 AX、DX:AX 或 EDX:EAX 暫存器。

雙運算元形式。對於此種形式,目標運算元(第一個運算元)乘以源運算元(第二個運算元)。目標運算元是通用暫存器,源運算元可以是立即數、通用暫存器或記憶體位置。乘積隨後儲存到目標運算元位置。

三運算元形式。此種形式需要一個目標運算元(第一個運算元)與兩個源運算元(第二個與第三個運算元)。這裡,第一個源運算元(可以是通用暫存器或記憶體位置)乘以第二個源運算元(立即數)。乘積隨後儲存到目標運算元(通用暫存器)。

將立即數用作運算元時,它按照符號擴充套件方式擴充套件到目標運算元格式的長度。

有效位進位到結果的上半部分時,CF 與 OF 標誌設定為 1。結果正好可以儲存到結果的下半部分時,清除 CF 與 OF 標誌。

IMUL 指令的三種形式有相似之處,這表現在乘積的長度是運算元長度的兩倍。對於單運算元形式,乘積正好可以儲存到目標暫存器。不過,對於雙運算元或三運算元形式,在將結果儲存到目標暫存器之前,需要將它截斷至目標暫存器的長度。由於此種截斷的原因,應該測試 CF 或 OF 標誌,以確保不丟失有效位。

因為無論運算元是否有符號,乘積的下半部分都相同,所以雙運算元與三運算元形式也可以使用無符號運算元。不過,此時不能使用 CF 與 OF 標誌確定結果的上半部分是否非零。

操作

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;

影響的標誌

對於單運算元形式的指令,有效位進位到結果的上半部分時,CF 與 OF 標誌設定為 1;結果正好可以儲存到結果的下半部分時,清除 CF 與 OF 標誌。對於雙運算元或三運算元形式的指令,結果必須截斷才能適合目標運算元大小時,將 CF 與 OF 標誌設定為 1;結果正好適合目標運算元大小時,清除 CF 與 OF 標誌。SF、ZF、AF 及 PF 標誌未定義。

保護模式異常

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

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

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

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

實地址模式異常

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

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

虛 8086 模式異常

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

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

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

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