RCL, RCR, ROL, ROR

Rotación

estableVMJITAOTinstruccion

Codificaciones

OpcodeInstruccionOp/En64 bitsCompat/LegacyDescripcion
D0 /2RCL r/m8, 1M1ValidoValidoRotar 9 bits (CF, r/m8) izquierda una vez.
D2 /2RCL r/m8, CLMCValidoValidoRotar 9 bits (CF, r/m8) izquierda tiempos CL.
C0 /2 ibRCL r/m8, imm8MIValidoValidoRotar 9 bits (CF, r/m8) izquierda imm8 veces.
D1 /2RCL r/m16, 1M1ValidoValidoGirar 17 bits (CF, r/m16) izquierda una vez.
D3 /2RCL r/m16, CLMCValidoValidoRotar 17 bits (CF, r/m16) izquierda tiempos CL.
C1 /2 ibRCL r/m16, imm8MIValidoValidoRotar 17 bits (CF, r/m16) izquierda imm8 veces.
D1 /2RCL r/m3, 1M1ValidoValidoGirar 33 bits (CF, r/m3) izquierda una vez.
REX.W + D1 /2RCL r/m64, 1M1ValidoNo codificableRotar 65 bits (CF, r/m64) izquierda una vez. Usa un recuento de 6 bits.
D3 /2RCL r/m3, CLMCValidoValidoGirar 33 bits (CF, r/m3) izquierda CL veces.
REX.W + D3 /2RCL r/m64, CLMCValidoNo codificableRotar 65 bits (CF, r/m64) izquierda tiempos de CL. Usa un recuento de 6 bits.
C1 /2 ibRCL r/m3, imm8MIValidoValidoGirar 33 bits (CF, r/m3) izquierda imm8 veces.
REX.W + C1 /2 ibRCL r/m64, imm8MIValidoNo codificableRotar 65 bits (CF, r/m64) izquierda imm8 veces. Usa un recuento de 6 bits.
D0 /3RCR r/m8, 1M1ValidoValidoGira 9 bits (CF, r/m8) justo una vez.
D2 /3RCR r/m8, CLMCValidoValidoRotar 9 bits (CF, r/m8) tiempo de CL derecho.
C0 /3 ibRCR r/m8, imm8MIValidoValidoRotar 9 bits (CF, r/m8) derecho imm8 veces.
D1 /3RCR r/m16, 1M1ValidoValidoGirar 17 bits (CF, r/m16) justo una vez.
D3 /3RCR r/m16, CLMCValidoValidoGirar 17 bits (CF, r/m16) tiempo de CL derecho.
C1 /3 ibRCR r/m16, imm8MIValidoValidoGirar 17 bits (CF, r/m16) derecho imm8 veces.
D1 /3RCR r/m3, 1M1ValidoValidoGirar 33 bits (CF, r/m3) justo una vez. Usa un recuento de 6 bits.
REX.W + D1 /3RCR r/m64, 1M1ValidoNo codificableRotar 65 bits (CF, r/m64) justo una vez. Usa un recuento de 6 bits.
D3 /3RCR r/m3, CLMCValidoValidoGirar 33 bits (CF, r/m3) tiempo de CL derecho.
REX.W + D3 /3RCR r/m64, CLMCValidoNo codificableRotar 65 bits (CF, r/m64) tiempo CL derecho. Usa un recuento de 6 bits.
C1 /3 ibRCR r/m3, imm8MIValidoValidoGirar 33 bits (CF, r/m3) derecho imm8 veces.
REX.W + C1 /3 ibRCR r/m64, imm8MIValidoNo codificableRotar 65 bits (CF, r/m64) derecho imm8. Usa un recuento de 6 bits.
D0 /0ROL r/m8,2 1M1ValidoValidoGirar 8 bits r/m8 izquierda una vez.
D2 /0ROL r/m8, CLMCValidoValidoGirar 8 bits r/m8 izquierda CL veces.
C0 /0 ibROL r/m8, imm8MIValidoValidoGirar 8 bits r/m8 izquierda imm8 veces.
D1 /0ROL r/m16, 1M1ValidoValidoGirar 16 bits r/m16 se fue una vez.
D3 /0ROL r/m16, CLMCValidoValidoGirar 16 bits r/m16 izquierda CL veces.
C1 /0 ibROL r/m16, imm8MIValidoValidoGirar 16 bits r/m16 izquierda imm8 veces.
D1 /0ROL r/m3, 1M1ValidoValidoGira 32 bits r/m3 se fue una vez.
REX.W + D1 /0ROL r/m64, 1M1ValidoNo codificableRotar 64 bits r/m64 izquierda una vez. Usa un recuento de 6 bits.
D3 /0ROL r/m3, CLMCValidoValidoGirar 32 bits r/m3 izquierda CL veces.
REX.W + D3 /0ROL r/m64, CLmc valid N.E. Rotate 64 bits r/m64 izquierda CL veces. Usa un recuento de 6 bits.
C1 /0 ibROL r/m3, imm8mi valid Valid Rotate 32 bits r/m3 izquierda imm8 veces.
REX.W + C1 /0 ibROL r/m64, imm8mi valid N.E. Rotate 64 bits r/m64 izquierda imm8 veces. Usa un conteo de 6 bits.
D0 /1ROR r/m8, 1m1 vaLid Valid Rotate 8 bits r/m8 derecha una vez.
D2 /1ROR r/m8, CLmc valid Valid Rotate 8 bits r/m8 derecho CL veces.
C0 /1 ibROR r/m8, imm8mi valid Valid Rotate 8 bits r/m16 derecha imm8 veces.
D1 /1ROR r/m16, 1m1 valid Valid Rotate 16 bits r/m16 derecha una vez.
D3 /1ROR r/m16, CLmc valid Valid Rotate 16 bits r/m16 derecho CL veces.
C1 /1 ibROR r/m16, imm8mi valid Valid Rotate 16 bits r/m16 derecha imm8 veces.
D1 /1ROR r/m3, 1m1 vaLid Valid Rotate 32 bits r/m3 justo una vez.
REX.W + D1 /1ROR r/m64, 1m1 valid N.E. Rotate 64 bits r/m64 derecha una vez. Usa un conteo de 6 bits.
D3 /1ROR r/m3, CLmc valid Valid Rotate 32 bits r/m3 derecho CL veces.
REX.W + D3 /1ROR r/m64, CLmc valid N.E. Rotate 64 bits r/m64 derecha CL veces. Usa un conteo de 6 bits.
C1 /1 ibROR r/m3, imm8mi valid Valid Rotate 32 bits r/m3 derecha imm8 veces.
REX.W + C1 /1 ibROR r/m64, imm8mi valid 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

  1. modrm.rm escriturabyte ModRM, campo r/m (bits 2-0); con el byte SIB y el desplazamiento cuando el campo mod los pide
  2. 1

MC

  1. modrm.rm escriturabyte ModRM, campo r/m (bits 2-0); con el byte SIB y el desplazamiento cuando el campo mod los pide
  2. CL

MI

  1. modrm.rm escriturabyte ModRM, campo r/m (bits 2-0); con el byte SIB y el desplazamiento cuando el campo mod los pide
  2. imm8byte inmediato que sigue a la instruccion

Coste medido

Cargando las mediciones de arch-data...

Banderas nombradas

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.
#UDSi se utiliza el prefijo LOCK.
Modo real
#GPSi 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.
#UDSi 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.
#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 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.
#UDSi se utiliza el prefijo LOCK.

Fuentes