IMUL
乘号
stableVMJITAOTinstruction
编码
| 操作码 | 指令 | Op/En | 64 位 | 兼容/传统 | 说明 |
|---|---|---|---|---|---|
F6 /5 | IMUL r/m8 | M | 有效 | 有效 | AX:=AL r/m 字节. |
F7 /5 | IMUL r/m16 | M | 有效 | 有效 | DX:AX:=AX r/m单词. |
F7 /5 | IMUL r/m32 | M | 有效 | 有效 | EDX:EAX:=EAX r/m32. 中国植物物种信息数据库. |
REX.W + F7 /5 | IMUL r/m64 | M | 有效 | 不可编码 | RDX:RAX:=RAX r/m64. 中国植物物种信息数据库. |
0F AF /r | IMUL r16, r/m16 | RM | 有效 | 有效 | 单词注册:=单词注册r/m16. |
0F AF /r | IMUL r32, r/m32 | RM | 有效 | 有效 | 双字寄存器:=双字寄存器 r/m32. |
REX.W + 0F AF /r | IMUL r64, r/m64 | RM | 有效 | 不可编码 | 四方词登记册:=四方词登记册r/m64. |
6B /r ib | IMUL r16, r/m16, imm8 | RMI | 有效 | 有效 | 单词寄存器:=r/m16 符号扩展即时字节. |
6B /r ib | IMUL r32, r/m32, imm8 | RMI | 有效 | 有效 | 双字寄存器:=r/m32 表示扩展的即时字节. |
REX.W + 6B /r ib | IMUL r64, r/m64, imm8 | RMI | 有效 | 不可编码 | Quadword register := r/m64 符号扩展即时字节. |
69 /r iw | IMUL r16, r/m16, imm16 | RMI | 有效 | 有效 | 单词寄存器:=r/m16即时单词. |
69 /r id | IMUL r32, r/m32, imm32 | RMI | 有效 | 有效 | 双字寄存器:=r/m32 即时双字. |
REX.W + 69 /r id | IMUL r64, r/m64, imm32 | RMI | 有效 | 不可编码 | Quadword register:=r/m64 即时双词. |
操作数编码
每个模式对应上表 Op/En 列的一个取值,说明各操作数按书写顺序分别编码在指令的哪个字段,以及指令对它是读、是写还是两者兼有。
M
modrm.rmlectura y escrituraModRM 字节的 r/m 字段(第 2-0 位);当 mod 字段要求时,还包括 SIB 字节和位移
RM
modrm.reglectura y escrituraModRM 字节的 reg 字段(第 5-3 位)modrm.rmlecturaModRM 字节的 r/m 字段(第 2-0 位);当 mod 字段要求时,还包括 SIB 字节和位移
RMI
modrm.reglectura y escrituraModRM 字节的 reg 字段(第 5-3 位)modrm.rmlecturaModRM 字节的 r/m 字段(第 2-0 位);当 mod 字段要求时,还包括 SIB 字节和位移imm8/16/32指令后的立即数,宽度与操作数相同
实测开销
正在从 arch-data 加载实测数据...
涉及的标志位
CF进位PF奇偶AF辅助进位ZF零SF符号OF溢出
说明
执行两个 操作数 的签名乘法。 本指令有三种形式,视操作数的数量而定.
- One-操作数表型--这个表型与MUL指令所使用的表型相同. 这里,源操作数(在
一个通用寄存器或内存位置)乘以在AL,AX,EAX或RAX寄存器中的值(取决于操作大小)和产品(输入操作器大小的两倍)分别存储在AX,DX:AX,EDX:EAX或RDX:RAX寄存器中的值.
- 2- 操作数 形式 - 用这个形式, 目标操作数(第一个 操作数) 乘以来源
操作数(第二个操作数). 目标操作数是一个通用寄存器,源操作数是一个直接值,一个通用寄存器,或者一个内存位置. 中间产物(与输入量操作数的大小翻两番)被截断并储存在目标操作数的位置.
- 3-操作数形式 - 这个形式需要目标操作数(第一个操作数)和两个源操作数.
(第二和第三个操作数). 在此,第一源操作数(可以是通用寄存器或内存位置)乘以第二源操作数(即时值). 中间产物(二倍于第一源操作数的尺寸)被切换并储存在目标操作数(a 通用寄存器)中.
当一个即时值被用作操作数时,其符号扩展为目标操作数格式的长度.
当中间产物的签名整数值与扩展的操作数大小的三联产品不同时,CF和OF旗被设定,否则CF和OF旗被清除.
IMUL指令的三种形式相似,即产品长度计算为操作数长度的两倍. 采用单操作数形式,产品完全储存在目的地. 但是,有了两面三面体的表格,结果在储存在目的地之前会缩短到目的地的长度。
目的地注册。 由于这种截断,应测试CF或OF旗,以确保不丢失显著位.
两加三-操作数的表格也可以使用无符号的操作数,因为产品的下半部是相同的,无论操作数是签名还是未签名. 然而,不能使用CF和OF旗来确定结果的上半部是否为非零.
在64位模式下,指令的默认操作大小为32位. 使用REX.R前缀可以访问额外的登记册(R8-R15). 使用REX.W前缀将操作提升到64位. 使用 REX.W 修改 3
forms of the instruction as follows.
- 1-操作数形式 - 源操作数(在64位的通用寄存器或内存位置中)是
乘以 RAX 寄存器中的值,产品存储在 RDX: RAX 寄存器中.
- 2-操作数形式--源操作数如果是一个寄存器或内存位置,则升级为64位. 该
目标操作数晋级64位.
- 3- 操作数 形式 - 第一源操作数( 注册或 内存位置) 和目的地
操作数晋级64位. 如果源操作数是即时的,则其标志扩展至64位.
行动
IF (NumberOfOperands = 1)
THEN IF (OperandSize = 8)
THEN
TMP_XP := AL SRC (* Signed multiplication; TMP_XP is a signed integer at twice the width of the SRC *);
AX := TMP_XP[15:0];
IF SignExtend(TMP_XP[7:0]) = TMP_XP
THEN CF := 0; OF := 0;
ELSE CF := 1; OF := 1; FI;
ELSE IF OperandSize = 16
THEN
TMP_XP := AX SRC (* Signed multiplication; TMP_XP is a signed integer at twice the width of the SRC *)
DX:AX := TMP_XP[31:0];
IF SignExtend(TMP_XP[15:0]) = TMP_XP
THEN CF := 0; OF := 0;
ELSE CF := 1; OF := 1; FI;
ELSE IF OperandSize = 32
THEN
TMP_XP := EAX SRC (* Signed multiplication; TMP_XP is a signed integer at twice the width of the SRC*)
EDX:EAX := TMP_XP[63:0];
IF SignExtend(TMP_XP[31:0]) = TMP_XP
THEN CF := 0; OF := 0;
ELSE CF := 1; OF := 1; FI;
ELSE (* OperandSize = 64 *)
TMP_XP := RAX SRC (* Signed multiplication; TMP_XP is a signed integer at twice the width of the SRC *)
EDX:EAX := TMP_XP[127:0];
IF SignExtend(TMP_XP[63:0]) = TMP_XP
THEN CF := 0; OF := 0;
ELSE CF := 1; OF := 1; FI;
FI;
FI;
ELSE IF (NumberOfOperands = 2)
THEN
TMP_XP := DEST SRC (* Signed multiplication; TMP_XP is a signed integer at twice the width of the SRC *)
DEST := TruncateToOperandSize(TMP_XP);
IF SignExtend(DEST) TMP_XP
THEN CF := 1; OF := 1;
ELSE CF := 0; OF := 0; FI;
ELSE (* NumberOfOperands = 3 *)
TMP_XP := SRC1 SRC2 (* Signed multiplication; TMP_XP is a signed integer at twice the width of the SRC1 *)
DEST := TruncateToOperandSize(TMP_XP);
IF SignExtend(DEST) TMP_XP
THEN CF := 1; OF := 1;
ELSE CF := 0; OF := 0; FI;
FI;
FI;受影响的旗帜
对于一个操作数形式的指令,CF和OF旗是在将大位带入结果的上半部时设置的,在结果完全与结果的下半部相符时清除. 对于指令的2和3-操作数形式,在结果必须切换以适应目标操作数大小时,CF和OF旗被设定,并在结果完全符合目标操作数大小时清除. SF,ZF,AF,和PF旗没有定义.
异常
保护模式
#GP(0) | 如果 内存操作数 有效地址位于 CS,DS,ES,FS 或 GS 区段限制之外,则使用 DS,ES,FS 或 GS 寄存器访问内存,并含有 NULL NULL 段选择子. |
#SS(0) | 如果 内存操作数 有效地址在 SS 段限制之外. #PF(fault-code) 如果 页面错误 发生. |
#AC(0) | 如果启用了对齐检查,并且在当前特权级别为3时会给出不对齐的内存引用. |
#UD | 如果使用 LOCK 前缀 。 |
实地址模式
#GP | 如果内存操作数的有效地址在CS,DS,ES,FS或GS段限制之外. |
#SS | 如果 内存操作数 的有效地址在 SS 段限制之外。 |
#UD | 如果使用 LOCK 前缀 。 |
虚拟 8086 模式
#GP(0) | 如果内存操作数的有效地址在CS,DS,ES,FS或GS段限制之外. |
#SS(0) | 如果 内存操作数 有效地址在 SS 段限制之外. #PF(fault-code) 如果 页面错误 发生. |
#AC(0) | 如果启用对齐检查, 并使用不对齐的内存引用 。 |
#UD | 如果使用 LOCK 前缀 。 |
兼容模式
| 与保护模式中的例外相同. |
64 位模式
#SS(0) | 如果引用SS部分的内存地址是非冠状的. |
#GP(0) | 如果内存地址是非冠状的. #PF(fault-code) 如果发生 页面错误. |
#AC(0) | 如果启用了对齐检查,并且在当前特权级别为3时会给出不对齐的内存引用. |
#UD | 如果使用 LOCK 前缀 。 |