IMUL
Multiply firmada
estableVMJITAOTinstruccion
Codificaciones
| Opcode | Instruccion | Op/En | 64 bits | Compat/Legacy | Descripcion |
|---|---|---|---|---|---|
F6 /5 | IMUL r/m8 | M | Valido | Valido | AX:= AL r/m byte. |
F7 /5 | IMUL r/m16 | M | Valido | Valido | DX:AX := AX r/m word. |
F7 /5 | IMUL r/m32 | M | Valido | Valido | EDX:EAX := EAX r/m32. |
REX.W + F7 /5 | IMUL r/m64 | M | Valido | No codificable | RDX:RAX := RAX r/m64. |
0F AF /r | IMUL r16, r/m16 | RM | Valido | Valido | Registro de palabras := registro de palabras r/m16. |
0F AF /r | IMUL r32, r/m32 | RM | Valido | Valido | Doubleword register := doubleword register r/m32. |
REX.W + 0F AF /r | IMUL r64, r/m64 | RM | Valido | No codificable | Quadword register := Quadword register r/m64. |
6B /r ib | IMUL r16, r/m16, imm8 | RMI | Valido | Valido | Registro de palabras := r/m16 señal-extended byte inmediato. |
6B /r ib | IMUL r32, r/m32, imm8 | RMI | Valido | Valido | Doubleword register := r/m32 signextended immediate byte. |
REX.W + 6B /r ib | IMUL r64, r/m64, imm8 | RMI | Valido | No codificable | Quadword register := r/m64 sign-extended immediate byte. |
69 /r iw | IMUL r16, r/m16, imm16 | RMI | Valido | Valido | Registro de palabras := r/m16 palabra inmediata. |
69 /r id | IMUL r32, r/m32, imm32 | RMI | Valido | Valido | Doubleword register := r/m32 doubleword inmediato. |
REX.W + 69 /r id | IMUL r64, r/m64, imm32 | RMI | Valido | No codificable | Quadword 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
modrm.rmlectura y escriturabyte ModRM, campo r/m (bits 2-0); con el byte SIB y el desplazamiento cuando el campo mod los pide
RM
modrm.reglectura y escriturabyte ModRM, campo reg (bits 5-3)modrm.rmlecturabyte ModRM, campo r/m (bits 2-0); con el byte SIB y el desplazamiento cuando el campo mod los pide
RMI
modrm.reglectura y escriturabyte ModRM, campo reg (bits 5-3)modrm.rmlecturabyte ModRM, campo r/m (bits 2-0); con el byte SIB y el desplazamiento cuando el campo mod los pideimm8/16/32inmediato que sigue a la instruccion, del ancho del operando
Coste medido
Cargando las mediciones de arch-data...
Banderas nombradas
CFAcarreoPFParidadAFAcarreo auxiliarZFCeroSFSignoOFDesbordamiento
Descripción
Realiza una multiplicación firmada de dos operandos. Esta instrucción tiene tres formas, dependiendo del número de operandos.
- Forma One-operando -- Esta forma es idéntica a la utilizada por la instrucción MUL. Aquí, el operando de origen (en
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.
- Forma de dos operando -- Con este formulario el operando de destino (el primer operando) se multiplica por la fuente
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.
- Forma de tres operando -- Esta forma requiere un operando de destino (el primer operando) y dos operandos de origen
(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.
- Una forma de operando --el operando de origen (en un registro de proposito general de 64 bits o ubicación de memoria) es
multiplicado por el valor en el registro RAX y el producto se almacena en los registros RDX:RAX.
- Forma de dos operando - el operando de origen es promovido a 64 bits si es un registro o una ubicación de memoria. El
operando de destino es promovido a 64 bits.
- Forma de tres operando - el primer operando de origen (ya sea un registro o una ubicación de memoria) y destino
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. |
#UD | Si se utiliza el prefijo LOCK. |
Modo real
#GP | Si un operando de memoria dirección efectiva está fuera del límite de segmento CS, DS, ES, FS o GS. |
#SS | Si un operando de memoria dirección efectiva está fuera del límite del segmento SS. |
#UD | Si 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. |
#UD | Si 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. |
#UD | Si se utiliza el prefijo LOCK. |