IMUL

Multiply firmada

estableVMJITAOTinstruccion

Codificaciones

OpcodeInstruccionOp/En64 bitsCompat/LegacyDescripcion
F6 /5IMUL r/m8MValidoValidoAX:= AL r/m byte.
F7 /5IMUL r/m16MValidoValidoDX:AX := AX r/m word.
F7 /5IMUL r/m32MValidoValidoEDX:EAX := EAX r/m32.
REX.W + F7 /5IMUL r/m64MValidoNo codificableRDX:RAX := RAX r/m64.
0F AF /rIMUL r16, r/m16RMValidoValidoRegistro de palabras := registro de palabras r/m16.
0F AF /rIMUL r32, r/m32RMValidoValidoDoubleword register := doubleword register r/m32.
REX.W + 0F AF /rIMUL r64, r/m64RMValidoNo codificableQuadword register := Quadword register r/m64.
6B /r ibIMUL r16, r/m16, imm8RMIValidoValidoRegistro de palabras := r/m16 señal-extended byte inmediato.
6B /r ibIMUL r32, r/m32, imm8RMIValidoValidoDoubleword register := r/m32 signextended immediate byte.
REX.W + 6B /r ibIMUL r64, r/m64, imm8RMIValidoNo codificableQuadword register := r/m64 sign-extended immediate byte.
69 /r iwIMUL r16, r/m16, imm16RMIValidoValidoRegistro de palabras := r/m16 palabra inmediata.
69 /r idIMUL r32, r/m32, imm32RMIValidoValidoDoubleword register := r/m32 doubleword inmediato.
REX.W + 69 /r idIMUL r64, r/m64, imm32RMIValidoNo codificableQuadword register := r/m64 palabra doble inmediata.

Codificacion de operandos

Cada modo es un valor de la columna Op/En de arriba. Dice en que campo de la instruccion codificada va cada operando, en el orden en que se escriben, y si la instruccion lo lee, lo escribe o ambas cosas.

M

  1. modrm.rm lectura y escriturabyte ModRM, campo r/m (bits 2-0); con el byte SIB y el desplazamiento cuando el campo mod los pide

RM

  1. modrm.reg lectura y escriturabyte ModRM, campo reg (bits 5-3)
  2. modrm.rm lecturabyte ModRM, campo r/m (bits 2-0); con el byte SIB y el desplazamiento cuando el campo mod los pide

RMI

  1. modrm.reg lectura y escriturabyte ModRM, campo reg (bits 5-3)
  2. modrm.rm lecturabyte ModRM, campo r/m (bits 2-0); con el byte SIB y el desplazamiento cuando el campo mod los pide
  3. imm8/16/32inmediato que sigue a la instruccion, del ancho del operando

Coste medido

Cargando las mediciones de arch-data...

Banderas nombradas

Descripción

Realiza una multiplicación firmada de dos operandos. Esta instrucción tiene tres formas, dependiendo del número de operandos.

un registro de proposito generaloubicación de memoria) se multiplica por el valor en el AL, AX,EAXoRAXregistro (dependiendo deel tamaño de operando) y el producto (twice el tamaño de la entradaoperando) se almacena en el AX, DX:AX,EDX:EAXoRDX:RAXregistros, respectivamente.

operando (segundo operando). El operando de destino es un registro de proposito general y el operando de origen es un valor inmediato, un registro de proposito general o una ubicación de memoria. El producto intermedio (twice el tamaño de la entrada operando) es truncado y almacenado en la ubicación el operando de destino.

(el segundo y el tercero operandos). Aquí, el primer operando de origen (que puede ser un registro de proposito general o una ubicación de memoria) se multiplica por el segundo operando de origen (un valor inmediato). El producto intermedio (twice el tamaño del primer operando de origen) es truncado y almacenado en el operando de destino (un registro de proposito general).

Cuando un valor inmediato se utiliza como un operando, se muestra en la longitud del formato el operando de destino.

Las banderas CF y OF se establecen cuando el valor entero firmado del producto intermedio difiere del producto extendido operando-size-truncated, de lo contrario las banderas CF y OF se limpian.

Las tres formas de la instrucción IMUL son similares en que la longitud del producto se calcula al doble de la longitud de los operandos. Con la forma de un operando, el producto se almacena exactamente en el destino. Con las dos y tres formas de operación, sin embargo, el resultado es truncado a la longitud del destino antes de que se almacena en el

registro de destino. Debido a esta truncación, se debe probar la bandera CF o OF para asegurar que no se pierdan partes significativas.

Las formas de dos y tres operando también se pueden utilizar con operandos sin signo porque la mitad inferior del producto es el mismo independientemente de que los operandos esté firmado o no firmado. Sin embargo, las banderas CF y OF no pueden utilizarse para determinar si la mitad superior del resultado no es cero.

En modo de 64 bits, el tamaño de operación predeterminado de la instrucción es de 32 bits. El uso del prefijo REX.R permite el acceso a registros adicionales (R8-R15). El uso del prefijo REX.W promueve la operación a 64 bits. El uso de REX.W modifica los tres

forms of the instruction as follows.

multiplicado por el valor en el registro RAX y el producto se almacena en los registros RDX:RAX.

operando de destino es promovido a 64 bits.

operando son ascendidos a 64 bits. Si el operando de origen es un inmediato, es signo extendido a 64 bits.

Operación

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;

Banderas afectadas

Para la forma operando de la instrucción, las banderas CF y OF se fijan cuando partes significativas se llevan a la mitad superior del resultado y se aclaran cuando el resultado encaja exactamente en la mitad inferior del resultado. Para las formas de dos y tres operando de la instrucción, las banderas CF y OF se establecen cuando el resultado debe ser truncado para caber en el tamaño el operando de destino y se aclara cuando el resultado se ajusta exactamente en el tamaño el operando de destino. Las banderas SF, ZF, AF y PF quedan indefinidas.

Excepciones

Modo protegido
#GP(0)Si un operando de memoria dirección efectiva está fuera del límite de segmento CS, DS, ES, FS o GS. Si el registro DS, ES, FS o GS se utiliza para acceder a la memoria y contiene un NULL NULL selector de segmento.
#SS(0)Si un operando de memoria dirección efectiva está fuera del límite del segmento SS. #PF(fault-code) Si un fallo de pagina ocurre.
#AC(0)Si la comprobación de alineación está habilitada y se hace una referencia de memoria no alineada mientras que el nivel de privilegio actual es 3.
#UDSi se utiliza el prefijo LOCK.
Modo real
#GPSi un operando de memoria dirección efectiva está fuera del límite de segmento CS, DS, ES, FS o GS.
#SSSi un operando de memoria dirección efectiva está fuera del límite del segmento SS.
#UDSi se utiliza el prefijo LOCK.
Modo virtual-8086
#GP(0)Si un operando de memoria dirección efectiva está fuera del límite de segmento CS, DS, ES, FS o GS.
#SS(0)Si un operando de memoria dirección efectiva está fuera del límite del segmento SS. #PF(fault-code) Si un fallo de pagina ocurre.
#AC(0)Si la comprobación de alineación está habilitada y se hace una referencia de memoria no alineada.
#UDSi se utiliza el prefijo LOCK.
Modo de compatibilidad
Las mismas excepciones que en modo protegido.
Modo de 64 bits
#SS(0)Si una dirección de memoria que hace referencia al segmento SS está en forma no canónica.
#GP(0)Si la dirección de memoria está en forma no canónica. #PF(fault-code) Si un fallo de pagina ocurre.
#AC(0)Si la comprobación de alineación está habilitada y se hace una referencia de memoria no alineada mientras que el nivel de privilegio actual es 3.
#UDSi se utiliza el prefijo LOCK.

Fuentes