IDIV

Señalado Divide

estableVMJITAOTinstruccion

Codificaciones

OpcodeInstruccionOp/En64 bitsCompat/LegacyDescripcion
F6 /7IDIV r/m8MValidoValidoPartida firmada AX por r/m8, con resultado almacenado en: AL := Quotient, AH := Restante.
F7 /7IDIV r/m16MValidoValidoDividencia firmada DX:AX por r/m16, con resultado almacenado en AX := Quotient, DX := Restante.
F7 /7IDIV r/m32MValidoValidoSeñalada EDX:EAX por r/m32, con resultado almacenado en EAX := Quotient, EDX := Restante.
REX.W + F7 /7IDIV r/m64MValidoNo codificableSeñ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

  1. modrm.rm lecturabyte 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

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 operandoDividendDivisorQuotientRestanteQuotient Range
e AXr/m8 ALAH-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
#DESi 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.
#UDSi se utiliza el prefijo LOCK.
Modo real
#DESi el operando de origen (divisor) es 0.
#GPEl resultado con signo (cociente) es demasiado grande para el destino.
#SSSi un operando de memoria dirección efectiva está fuera del límite de segmento CS, DS, ES, FS o GS.
#UDSi un operando de memoria dirección efectiva está fuera del límite del segmento SS. Si el prefijo LOCK es utilizado.
Modo virtual-8086
#DESi 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.
#UDSi 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.
#DESi 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.
#UDSi se utiliza el prefijo LOCK.

Fuentes