RCL, RCR, ROL, ROR
Rotación
estableVMJITAOTinstruccion
Codificaciones
| Opcode | Instruccion | Op/En | 64 bits | Compat/Legacy | Descripcion |
|---|---|---|---|---|---|
D0 /2 | RCL r/m8, 1 | M1 | Valido | Valido | Rotar 9 bits (CF, r/m8) izquierda una vez. |
D2 /2 | RCL r/m8, CL | MC | Valido | Valido | Rotar 9 bits (CF, r/m8) izquierda tiempos CL. |
C0 /2 ib | RCL r/m8, imm8 | MI | Valido | Valido | Rotar 9 bits (CF, r/m8) izquierda imm8 veces. |
D1 /2 | RCL r/m16, 1 | M1 | Valido | Valido | Girar 17 bits (CF, r/m16) izquierda una vez. |
D3 /2 | RCL r/m16, CL | MC | Valido | Valido | Rotar 17 bits (CF, r/m16) izquierda tiempos CL. |
C1 /2 ib | RCL r/m16, imm8 | MI | Valido | Valido | Rotar 17 bits (CF, r/m16) izquierda imm8 veces. |
D1 /2 | RCL r/m3, 1 | M1 | Valido | Valido | Girar 33 bits (CF, r/m3) izquierda una vez. |
REX.W + D1 /2 | RCL r/m64, 1 | M1 | Valido | No codificable | Rotar 65 bits (CF, r/m64) izquierda una vez. Usa un recuento de 6 bits. |
D3 /2 | RCL r/m3, CL | MC | Valido | Valido | Girar 33 bits (CF, r/m3) izquierda CL veces. |
REX.W + D3 /2 | RCL r/m64, CL | MC | Valido | No codificable | Rotar 65 bits (CF, r/m64) izquierda tiempos de CL. Usa un recuento de 6 bits. |
C1 /2 ib | RCL r/m3, imm8 | MI | Valido | Valido | Girar 33 bits (CF, r/m3) izquierda imm8 veces. |
REX.W + C1 /2 ib | RCL r/m64, imm8 | MI | Valido | No codificable | Rotar 65 bits (CF, r/m64) izquierda imm8 veces. Usa un recuento de 6 bits. |
D0 /3 | RCR r/m8, 1 | M1 | Valido | Valido | Gira 9 bits (CF, r/m8) justo una vez. |
D2 /3 | RCR r/m8, CL | MC | Valido | Valido | Rotar 9 bits (CF, r/m8) tiempo de CL derecho. |
C0 /3 ib | RCR r/m8, imm8 | MI | Valido | Valido | Rotar 9 bits (CF, r/m8) derecho imm8 veces. |
D1 /3 | RCR r/m16, 1 | M1 | Valido | Valido | Girar 17 bits (CF, r/m16) justo una vez. |
D3 /3 | RCR r/m16, CL | MC | Valido | Valido | Girar 17 bits (CF, r/m16) tiempo de CL derecho. |
C1 /3 ib | RCR r/m16, imm8 | MI | Valido | Valido | Girar 17 bits (CF, r/m16) derecho imm8 veces. |
D1 /3 | RCR r/m3, 1 | M1 | Valido | Valido | Girar 33 bits (CF, r/m3) justo una vez. Usa un recuento de 6 bits. |
REX.W + D1 /3 | RCR r/m64, 1 | M1 | Valido | No codificable | Rotar 65 bits (CF, r/m64) justo una vez. Usa un recuento de 6 bits. |
D3 /3 | RCR r/m3, CL | MC | Valido | Valido | Girar 33 bits (CF, r/m3) tiempo de CL derecho. |
REX.W + D3 /3 | RCR r/m64, CL | MC | Valido | No codificable | Rotar 65 bits (CF, r/m64) tiempo CL derecho. Usa un recuento de 6 bits. |
C1 /3 ib | RCR r/m3, imm8 | MI | Valido | Valido | Girar 33 bits (CF, r/m3) derecho imm8 veces. |
REX.W + C1 /3 ib | RCR r/m64, imm8 | MI | Valido | No codificable | Rotar 65 bits (CF, r/m64) derecho imm8. Usa un recuento de 6 bits. |
D0 /0 | ROL r/m8,2 1 | M1 | Valido | Valido | Girar 8 bits r/m8 izquierda una vez. |
D2 /0 | ROL r/m8, CL | MC | Valido | Valido | Girar 8 bits r/m8 izquierda CL veces. |
C0 /0 ib | ROL r/m8, imm8 | MI | Valido | Valido | Girar 8 bits r/m8 izquierda imm8 veces. |
D1 /0 | ROL r/m16, 1 | M1 | Valido | Valido | Girar 16 bits r/m16 se fue una vez. |
D3 /0 | ROL r/m16, CL | MC | Valido | Valido | Girar 16 bits r/m16 izquierda CL veces. |
C1 /0 ib | ROL r/m16, imm8 | MI | Valido | Valido | Girar 16 bits r/m16 izquierda imm8 veces. |
D1 /0 | ROL r/m3, 1 | M1 | Valido | Valido | Gira 32 bits r/m3 se fue una vez. |
REX.W + D1 /0 | ROL r/m64, 1 | M1 | Valido | No codificable | Rotar 64 bits r/m64 izquierda una vez. Usa un recuento de 6 bits. |
D3 /0 | ROL r/m3, CL | MC | Valido | Valido | Girar 32 bits r/m3 izquierda CL veces. |
REX.W + D3 /0 | ROL r/m64, CL | mc va | lid N.E. Rotate 64 bits r/m64 izquierda CL veces. Usa un recuento de 6 bits. | ||
C1 /0 ib | ROL r/m3, imm8 | mi va | lid Valid Rotate 32 bits r/m3 izquierda imm8 veces. | ||
REX.W + C1 /0 ib | ROL r/m64, imm8 | mi va | lid N.E. Rotate 64 bits r/m64 izquierda imm8 veces. Usa un conteo de 6 bits. | ||
D0 /1 | ROR r/m8, 1 | m1 va | Lid Valid Rotate 8 bits r/m8 derecha una vez. | ||
D2 /1 | ROR r/m8, CL | mc va | lid Valid Rotate 8 bits r/m8 derecho CL veces. | ||
C0 /1 ib | ROR r/m8, imm8 | mi va | lid Valid Rotate 8 bits r/m16 derecha imm8 veces. | ||
D1 /1 | ROR r/m16, 1 | m1 va | lid Valid Rotate 16 bits r/m16 derecha una vez. | ||
D3 /1 | ROR r/m16, CL | mc va | lid Valid Rotate 16 bits r/m16 derecho CL veces. | ||
C1 /1 ib | ROR r/m16, imm8 | mi va | lid Valid Rotate 16 bits r/m16 derecha imm8 veces. | ||
D1 /1 | ROR r/m3, 1 | m1 va | Lid Valid Rotate 32 bits r/m3 justo una vez. | ||
REX.W + D1 /1 | ROR r/m64, 1 | m1 va | lid N.E. Rotate 64 bits r/m64 derecha una vez. Usa un conteo de 6 bits. | ||
D3 /1 | ROR r/m3, CL | mc va | lid Valid Rotate 32 bits r/m3 derecho CL veces. | ||
REX.W + D3 /1 | ROR r/m64, CL | mc va | lid N.E. Rotate 64 bits r/m64 derecha CL veces. Usa un conteo de 6 bits. | ||
C1 /1 ib | ROR r/m3, imm8 | mi va | lid Valid Rotate 32 bits r/m3 derecha imm8 veces. | ||
REX.W + C1 /1 ib | ROR r/m64, imm8 | mi va | lid N.E. Rotate 64 bits r/m64 derecha imm8 veces. Usa un conteo de 6 bits. |
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.
M1
modrm.rmescriturabyte ModRM, campo r/m (bits 2-0); con el byte SIB y el desplazamiento cuando el campo mod los pide1
MC
modrm.rmescriturabyte ModRM, campo r/m (bits 2-0); con el byte SIB y el desplazamiento cuando el campo mod los pideCL
MI
modrm.rmescriturabyte ModRM, campo r/m (bits 2-0); con el byte SIB y el desplazamiento cuando el campo mod los pideimm8byte inmediato que sigue a la instruccion
Coste medido
Cargando las mediciones de arch-data...
Banderas nombradas
CFAcarreoPFParidadAFAcarreo auxiliarZFCeroSFSignoOFDesbordamiento
Descripción
Cambios (rota) los bits del primer operando (operando de destino) el número de posiciones de bits especificados en el segundo operando (cuenta operando) y almacena el resultado en el operando de destino. El operando de destino puede ser un registro o una ubicación de memoria; el conteo operando es un entero sin firma que puede ser un valor inmediato o un valor en el registro CL. El conteo está enmascarado a 5 bits (o 6 bits si en modo de 64 bits y REX.W = 1).
Las instrucciones giran a la izquierda (ROL) y giran a través de la izquierda (RCL) desplazan todos los bits hacia posiciones de bits más significativas, excepto por el bit más significativo, que se gira a la ubicación de bits menos significativa. Las instrucciones girar derecha (ROR) y girar a través de la derecha (RCR) desplazan todos los bits hacia posiciones poco significativas menos, excepto por el bit menos significativo, que se gira a la ubicación de bits más significativa.
Las instrucciones RCL y RCR incluyen la bandera CF en la rotación. La instrucción RCL cambia la bandera CF en el bit menos significativo y cambia el bit más significativo en la bandera CF. La instrucción RCR cambia la bandera CF en el bit más significativo y cambia el bit menos significativo en la bandera CF. Para las instrucciones ROL y ROR, el valor original de la bandera CF no es parte del resultado, pero la bandera CF recibe una copia del bit que se cambió de un extremo a otro.
La bandera OF se define sólo para los rotatorios de 1 bit; no está definida en todos los demás casos (excepto las instrucciones RCL y RCR únicamente: un giro de cero bit no hace nada, que no afecta ninguna bandera). Para girar a la izquierda, la bandera OF se fija en el exclusivo quirófano del bit CF (después del giro) y el bit más significativo del resultado. Para girar a la derecha, la bandera OF se fija en el exclusivo OR de los dos bits más significativos del resultado.
En modo de 64 bits, el uso de un prefijo REX en forma de REX.R permite el acceso a registros adicionales (R8-R15). El uso de REX.W promueve el primer operando a 64 bits y hace que el conteo operando se convierta en un contador de 6 bits.
Compatibilidad de arquitectura IA-32
El 8086 no enmascara el recuento de rotación. Sin embargo, todos los demás procesadores IA-32 (comenzando con el procesador Intel 286) enmascaran el recuento de rotación a 5 bits, dando como resultado un recuento máximo de 31. Este enmascaramiento se realiza en todos los modos operativos (incluyendo el modo virtual-8086) para reducir el tiempo máximo de ejecución de las instrucciones.
Operación
(* RCL and RCR Instructions *)
SIZE := OperandSize;
CASE (determine count) OF
SIZE := 8: tempCOUNT := (COUNT AND 1FH) MOD 9;
SIZE := 16: tempCOUNT := (COUNT AND 1FH) MOD 17;
SIZE := 32: tempCOUNT := COUNT AND 1FH;
SIZE := 64: tempCOUNT := COUNT AND 3FH;
ESAC;
IF OperandSize = 64
THEN COUNTMASK = 3FH;
ELSE COUNTMASK = 1FH;
FI;
(* RCL Instruction Operation *)
tempDEST := DEST;
WHILE (tempCOUNT 0)
DO
tempCF := MSB(tempDEST);
tempDEST := (tempDEST 2) + CF;
CF := tempCF;
tempCOUNT := tempCOUNT 1;
OD;
ELIHW;
IF (COUNT & COUNTMASK) = 1
THEN OF := MSB(tempDEST) XOR CF;
ELSE OF is undefined;
FI;
DEST := tempDEST;
(* RCR Instruction Operation *)
tempDEST := DEST;
IF (COUNT & COUNTMASK) = 1
THEN OF := MSB(tempDEST) XOR CF;
ELSE OF is undefined;
FI;
WHILE (tempCOUNT 0)
DO
tempCF := LSB(SRC);
tempDEST := (tempDEST / 2) + (CF * 2SIZE);
CF := tempCF;
tempCOUNT := tempCOUNT 1;
OD;
DEST := tempDEST;
(* ROL Instruction Operation *)
tempCOUNT := (COUNT & COUNTMASK) MOD SIZE
tempDEST := DEST;
WHILE (tempCOUNT 0)
DO
tempCF := MSB(tempDEST);
tempDEST := (tempDEST 2) + tempCF;
tempCOUNT := tempCOUNT 1;
OD;
ELIHW;
IF (COUNT & COUNTMASK) 0
THEN CF := LSB(tempDEST);
FI;
IF (COUNT & COUNTMASK) = 1
THEN OF := MSB(tempDEST) XOR CF;
ELSE OF is undefined;
FI;
DEST := tempDEST;
(* ROR Instruction Operation *)
tempCOUNT := (COUNT & COUNTMASK) MOD SIZE
tempDEST := DEST;
WHILE (tempCOUNT 0)
DO
tempCF := LSB(SRC);
tempDEST := (tempDEST / 2) + (tempCF 2SIZE);
tempCOUNT := tempCOUNT 1;
OD;
ELIHW;
IF (COUNT & COUNTMASK) 0
THEN CF := MSB(tempDEST);
FI;
IF (COUNT & COUNTMASK) = 1
THEN OF := MSB(tempDEST) XOR MSB - 1(tempDEST);
ELSE OF is undefined;
FI;
DEST := tempDEST;Banderas afectadas
Para las instrucciones RCL y RCR, un giro de cero bit no afecta nada, es decir, a ninguna bandera. Para instrucciones ROL y ROR, si el conteo enmascarado es 0, las banderas no se ven afectadas. Si el conteo enmascarado es 1, entonces la bandera OF se ve afectada, de lo contrario (conteo enmascarado es mayor que 1) la bandera OF no está definida.
Para todas las instrucciones, la bandera CF se ve afectada cuando el conteo enmascarado no es cero. Las banderas SF, ZF, AF y PF siempre no están afectadas.
Excepciones
Modo protegido
#GP(0) | Si el operando de origen se encuentra en un segmento no escrito. Si la dirección efectiva un operando de memoria 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
#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 el operando de origen se encuentra en un segmento no escrito. 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. |