DIV

Divide no firmado

estableVMJITAOTinstruccion

Codificaciones

OpcodeInstruccionOp/En64 bitsCompat/LegacyDescripcion
F6 /6DIV r/m8MValidoValidoUnsigned divide AX por r/m8, con resultado almacenado en AL := Quotient, AH := Restante.
F7 /6DIV r/m16MValidoValidoDividencia no firmada DX:AX por r/m16, con resultado almacenado en AX := Quotient, DX := Restante.
F7 /6DIV r/m32MValidoValidoUnsigned divide EDX:EAX por r/m32, con resultado almacenado en EAX := Quotient, EDX := Restante.
REX.W + F7 /6DIV r/m64MValidoNo codificableUnsigned divide 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 escriturabyte 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 sin asignar el valor en el AX, DX:AX,EDX:EAXoRDX:RAXregistros (dividendo) porel operando de origen(divisor) y almacena el resultado en el AX (AH:AL), DX:AX,EDX:EAXoRDX:RAXregistros. 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). La división que utiliza operando de 64 bits sólo está disponible en modo de 64 bits.

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 sin signo en RDX:RAX por el operando de origen y almacena el cociente en RAX, el resto en RDX.

Vea la tabla resumen al comienzo de esta sección para la codificación de datos y límites. Véase el cuadro 3-17.

DIV Action

Word/byteAXr/m8ALAH255
Espada dobleDX:AXr/m16AXDX65,535
Quadword/doblewordEDX:EAXr/m32EAXEDX232 - 1
Doble palabra/RDX:RAXr/m64RAXRDX264 - 1
quadword
DIV...

Operación

IF SRC = 0

    THEN #DE; FI; (* Divide Error *)
IF OperandSize = 8 (* Word/Byte Operation *)

    THEN
          temp := AX / SRC;
          IF temp > FFH
                THEN #DE; (* Divide error *)
                ELSE
                       AL := temp;
                       AH := AX MOD SRC;
          FI;

   ELSE IF OperandSize = 16 (* Doubleword/word operation *)

          THEN
                temp := DX:AX / SRC;
                IF temp > FFFFH
                       THEN #DE; (* Divide error *)
                ELSE
                       AX := temp;
                       DX := DX:AX MOD SRC;
                FI;

          FI;
    ELSE IF Operandsize = 32 (* Quadword/doubleword operation *)

          THEN
                temp := EDX:EAX / SRC;
                IF temp > FFFFFFFFH
                       THEN #DE; (* Divide error *)
                ELSE
                       EAX := temp;
                       EDX := EDX:EAX MOD SRC;
                FI;

          FI;
    ELSE IF 64-Bit Mode and Operandsize = 64 (* Doublequadword/quadword operation *)

          THEN
                temp := RDX:RAX / SRC;
                IF temp > FFFFFFFFFFFFFFFFH
                       THEN #DE; (* Divide error *)
                ELSE
                       RAX := temp;
                       RDX := RDX:RAX MOD 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 Si el cociente es demasiado grande para el registro designado.
#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 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. Si el cociente es demasiado grande para el registro designado.
#GPSi 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 contiene un NULL selector de segmento.
#SS(0)Si un operando de memoria dirección efectiva está fuera del límite del segmento SS.
#UDSi se utiliza el prefijo LOCK.
Modo virtual-8086
#DESi el operando de origen (divisor) es 0. Si el cociente es demasiado grande para el registro designado.
#GP(0)Si 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. #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.
#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