操作碼 |
指令 |
說明 |
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 段限制。
#GP(0) - 如果記憶體運算元有效地址超出 CS、DS、ES、FS 或 GS 段限制。
#SS(0) - 如果記憶體運算元有效地址超出 SS 段限制。
#PF(錯誤程式碼) - 如果發生頁錯誤。
#AC(0) - 如果在啟用對齊檢查的情況下進行未對齊的記憶體引用。