IMUL

乘号

stableVMJITAOTinstruction

编码

操作码指令Op/En64 位兼容/传统说明
F6 /5IMUL r/m8M有效有效AX:=AL r/m 字节.
F7 /5IMUL r/m16M有效有效DX:AX:=AX r/m单词.
F7 /5IMUL r/m32M有效有效EDX:EAX:=EAX r/m32. 中国植物物种信息数据库.
REX.W + F7 /5IMUL r/m64M有效不可编码RDX:RAX:=RAX r/m64. 中国植物物种信息数据库.
0F AF /rIMUL r16, r/m16RM有效有效单词注册:=单词注册r/m16.
0F AF /rIMUL r32, r/m32RM有效有效双字寄存器:=双字寄存器 r/m32.
REX.W + 0F AF /rIMUL r64, r/m64RM有效不可编码四方词登记册:=四方词登记册r/m64.
6B /r ibIMUL r16, r/m16, imm8RMI有效有效单词寄存器:=r/m16 符号扩展即时字节.
6B /r ibIMUL r32, r/m32, imm8RMI有效有效双字寄存器:=r/m32 表示扩展的即时字节.
REX.W + 6B /r ibIMUL r64, r/m64, imm8RMI有效不可编码Quadword register := r/m64 符号扩展即时字节.
69 /r iwIMUL r16, r/m16, imm16RMI有效有效单词寄存器:=r/m16即时单词.
69 /r idIMUL r32, r/m32, imm32RMI有效有效双字寄存器:=r/m32 即时双字.
REX.W + 69 /r idIMUL r64, r/m64, imm32RMI有效不可编码Quadword register:=r/m64 即时双词.

操作数编码

每个模式对应上表 Op/En 列的一个取值,说明各操作数按书写顺序分别编码在指令的哪个字段,以及指令对它是读、是写还是两者兼有。

M

  1. modrm.rm lectura y escrituraModRM 字节的 r/m 字段(第 2-0 位);当 mod 字段要求时,还包括 SIB 字节和位移

RM

  1. modrm.reg lectura y escrituraModRM 字节的 reg 字段(第 5-3 位)
  2. modrm.rm lecturaModRM 字节的 r/m 字段(第 2-0 位);当 mod 字段要求时,还包括 SIB 字节和位移

RMI

  1. modrm.reg lectura y escrituraModRM 字节的 reg 字段(第 5-3 位)
  2. modrm.rm lecturaModRM 字节的 r/m 字段(第 2-0 位);当 mod 字段要求时,还包括 SIB 字节和位移
  3. imm8/16/32指令后的立即数,宽度与操作数相同

实测开销

正在从 arch-data 加载实测数据...

涉及的标志位

说明

执行两个 操作数 的签名乘法。 本指令有三种形式,视操作数的数量而定.

一个通用寄存器或内存位置)乘以在AL,AX,EAX或RAX寄存器中的值(取决于操作大小)和产品(输入操作器大小的两倍)分别存储在AX,DX:AX,EDX:EAX或RDX:RAX寄存器中的值.

操作数(第二个操作数). 目标操作数是一个通用寄存器,源操作数是一个直接值,一个通用寄存器,或者一个内存位置. 中间产物(与输入量操作数的大小翻两番)被截断并储存在目标操作数的位置.

(第二和第三个操作数). 在此,第一源操作数(可以是通用寄存器或内存位置)乘以第二源操作数(即时值). 中间产物(二倍于第一源操作数的尺寸)被切换并储存在目标操作数(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.

乘以 RAX 寄存器中的值,产品存储在 RDX: RAX 寄存器中.

目标操作数晋级64位.

操作数晋级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 前缀 。

来源