IDIV
Señalado Divide
estableVMJITAOTinstruccion
Codificaciones
| Opcode | Instruccion | Op/En | 64 bits | Compat/Legacy | Descripcion |
|---|---|---|---|---|---|
F6 /7 | IDIV r/m8 | M | Valido | Valido | Partida firmada AX por r/m8, con resultado almacenado en: AL := Quotient, AH := Restante. |
F7 /7 | IDIV r/m16 | M | Valido | Valido | Dividencia firmada DX:AX por r/m16, con resultado almacenado en AX := Quotient, DX := Restante. |
F7 /7 | IDIV r/m32 | M | Valido | Valido | Señalada EDX:EAX por r/m32, con resultado almacenado en EAX := Quotient, EDX := Restante. |
REX.W + F7 /7 | IDIV r/m64 | M | Valido | No codificable | Señalada RDX:RAX por r/m64, con resultado almacenado en RAX := Quotient, RDX := Restante. |
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.rmlecturabyte ModRM, campo r/m (bits 2-0); con el byte SIB y el desplazamiento cuando el campo mod los pide
Coste medido
Cargando las mediciones de arch-data...
Banderas nombradas
CFAcarreoPFParidadAFAcarreo auxiliarZFCeroSFSignoOFDesbordamiento
Descripción
Divide el valor (firmado) en el AX, DX:AX, o EDX:EAX (dividend) por el operando de origen (divisor) y almacena el resultado en los registros AX (AH:AL), DX:AX, o EDX:EAX. El operando de origen puede ser un registro de proposito general o una ubicación de memoria. La acción de esta instrucción depende del tamaño de operando (dividend/divisor).
Los resultados no integrados son truncados (recortados) hacia 0. El resto es siempre menos que el divisor en magnitud. El desbordamiento se indica con la excepción #DE (divide error) en lugar de con la bandera CF.
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. En modo de 64 bits cuando se aplica REX.W, la instrucción divide el valor con signo en RDX:RAX por el operando de origen. RAX contiene un cociente de 64 bits; RDX contiene un resto de 64 bits.
Vea la tabla resumen al comienzo de esta sección para la codificación de datos y límites. Véase el cuadro 3-53.
Resultados IDIV
| Tamaño de operando | Dividend | Divisor | Quotient | Restante | Quotient Range |
|---|---|---|---|---|---|
| e AX | r/m8 AL | AH | -128 to +127 |
Operación
IF SRC = 0
THEN #DE; (* Divide error *)
FI;
IF OperandSize = 8 (* Word/byte operation *)
THEN
temp := AX / SRC; (* Signed division *)
IF (temp > 7FH) or (temp < 80H)
(* If a positive result is greater than 7FH or a negative result is less than 80H *)
THEN #DE; (* Divide error *)
ELSE
AL := temp;
AH := AX SignedModulus SRC;
FI;
ELSE IF OperandSize = 16 (* Doubleword/word operation *)
THEN
temp := DX:AX / SRC; (* Signed division *)
IF (temp > 7FFFH) or (temp < 8000H)
(* If a positive result is greater than 7FFFH
or a negative result is less than 8000H *)
THEN
#DE; (* Divide error *)
ELSE
AX := temp;
DX := DX:AX SignedModulus SRC;
FI;
FI;
ELSE IF OperandSize = 32 (* Quadword/doubleword operation *)
temp := EDX:EAX / SRC; (* Signed division *)
IF (temp > 7FFFFFFFH) or (temp < 80000000H)
(* If a positive result is greater than 7FFFFFFFH
or a negative result is less than 80000000H *)
THEN
#DE; (* Divide error *)
ELSE
EAX := temp;
EDX := EDXE:AX SignedModulus SRC;
FI;
FI;
ELSE IF OperandSize = 64 (* Doublequadword/quadword operation *)
temp := RDX:RAX / SRC; (* Signed division *)
IF (temp > 7FFFFFFFFFFFFFFFH) or (temp < 8000000000000000H)
(* If a positive result is greater than 7FFFFFFFFFFFFFFFH
or a negative result is less than 8000000000000000H *)
THEN
#DE; (* Divide error *)
ELSE
RAX := temp;
RDX := RDE:RAX SignedModulus SRC;
FI;
FI;
FI;Banderas afectadas
El CF, OF, SF, ZF, AF y PF banderas quedan indefinidas.
Excepciones
Modo protegido
#DE | Si el operando de origen (divisor) es 0. el resultado con signo (cociente) es demasiado grande para el destino. |
#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 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
#DE | Si el operando de origen (divisor) es 0. |
#GP | El resultado con signo (cociente) es demasiado grande para el destino. |
#SS | Si un operando de memoria dirección efectiva está fuera del límite de segmento CS, DS, ES, FS o GS. |
#UD | Si un operando de memoria dirección efectiva está fuera del límite del segmento SS. Si el prefijo LOCK es utilizado. |
Modo virtual-8086
#DE | Si el operando de origen (divisor) es 0. |
#GP(0) | El resultado con signo (cociente) es demasiado grande para el destino. |
#SS(0) | Si un operando de memoria dirección efectiva está fuera del límite de segmento CS, DS, ES, FS o GS. |
#PF(fault-code) | Si un operando de memoria dirección efectiva está fuera del límite del segmento SS. |
#AC(0) | Si un fallo de pagina ocurre. |
#UD | Si la comprobación de alineación está activada y se hace una referencia de memoria no alineada. 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. |
#DE | Si el operando de origen (divisor) es 0 Si el cociente es demasiado grande para el registro designado. #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. |