DIV
Divide no firmado
estableVMJITAOTinstruccion
Codificaciones
| Opcode | Instruccion | Op/En | 64 bits | Compat/Legacy | Descripcion |
|---|---|---|---|---|---|
F6 /6 | DIV r/m8 | M | Valido | Valido | Unsigned divide AX por r/m8, con resultado almacenado en AL := Quotient, AH := Restante. |
F7 /6 | DIV r/m16 | M | Valido | Valido | Dividencia no firmada DX:AX por r/m16, con resultado almacenado en AX := Quotient, DX := Restante. |
F7 /6 | DIV r/m32 | M | Valido | Valido | Unsigned divide EDX:EAX por r/m32, con resultado almacenado en EAX := Quotient, EDX := Restante. |
REX.W + F7 /6 | DIV r/m64 | M | Valido | No codificable | Unsigned 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
modrm.rmescriturabyte 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 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/byte | AX | r/m8 | AL | AH | 255 |
|---|---|---|---|---|---|
| Espada doble | DX:AX | r/m16 | AX | DX | 65,535 |
| Quadword/dobleword | EDX:EAX | r/m32 | EAX | EDX | 232 - 1 |
| Doble palabra/ | RDX:RAX | r/m64 | RAX | RDX | 264 - 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
#DE | Si 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. |
#UD | Si se utiliza el prefijo LOCK. |
Modo real
#DE | Si el operando de origen (divisor) es 0. Si el cociente es demasiado grande para el registro designado. |
#GP | 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. |
#UD | Si se utiliza el prefijo LOCK. |
Modo virtual-8086
#DE | Si 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. |
#SS | 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. |
#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. |