Instrucciones de desplazamiento y rotación en ensamblador: referencia completa

Las instrucciones de desplazamiento y rotación son operaciones bitwise fundamentales que manipulan el contenido de los registros a nivel binario. Son esenciales para aritmética eficiente, empaquetado de bits, criptografía y programación de sistemas de bajo nivel.

Instrucciones de desplazamiento

Mueven bits a la izquierda o derecha, descartando los bits que caen del extremo (excepto en banderas).

Desplazamientos lógicos

  • SHL / SAL (Desplazar izquierda lógico/aritmético): los bits se desplazan hacia el MSB. LSB se llena con 0. MSB → Bandera de acarreo (CF). Multiplicación sin signo por 2ⁿ.
  • SHR (Desplazar derecha lógico): los bits se desplazan hacia el LSB. MSB se llena con 0. LSB → CF. División sin signo por 2ⁿ.

Desplazamientos aritméticos

  • SAR (Desplazar derecha aritmético): los bits se desplazan hacia el LSB. MSB se replica (extensión de signo). LSB → CF. División con signo por 2ⁿ (redondea hacia -∞).

Resumen de instrucciones de desplazamiento (x86)

InstrucciónOperaciónCFOFCaso de uso
SHL r, cl/immr ← r << nÚltimo bit desplazadoSe establece si cambia el signo (desplazamiento de 1 bit)Multiplicación rápida sin signo ×2ⁿ
SHR r, cl/immr ← r >> n (relleno con cero)Último bit desplazadoSe establece si cambia el signo (desplazamiento de 1 bit)División rápida sin signo ÷2ⁿ
SAR r, cl/immr ← r >> n (relleno con signo)Último bit desplazadoSiempre 0División rápida con signo ÷2ⁿ

Instrucciones de rotación

Los bits se envuelven: no se pierden bits. CF captura el bit que cruza el límite.

Tipos

  • ROL (Rotar izquierda): MSB → LSB y CF
  • ROR (Rotar derecha): LSB → MSB y CF
  • RCL (Rotar a través del acarreo izquierda): CF → LSB, MSB → CF (rotación de n+1 bits)
  • RCR (Rotar a través del acarreo derecha): CF → MSB, LSB → CF (rotación de n+1 bits)

Ejemplos prácticos (ensamblador x86)

Multiplicar EAX por 8

shl eax, 3 ; EAX *= 8 (2^3)

Dividir EAX por 4 (sin signo)

shr eax, 2 ; EAX /= 4

Dividir EAX por 4 (con signo)

sar eax, 2 ; Preserva el signo

Extraer byte bajo a AL

movzx eax, al ; O: and eax, 0xFF

Insertar valor en bits 8-15

shl eax, 8 ; Mueve bits existentes 8-15 a 16-23
mov al, 0x12 ; Inserta nuevo byte bajo (ejemplo)
; Mejor: and eax, 0xFFFF00FF; or eax, (0x12 << 8)

Intercambiar 16 bits alto/bajo de EAX

rol eax, 16 ; rotación de 32 bits

Índice de búfer circular (módulo potencia de 2)

inc edi
and edi, BUFFER_SIZE-1 ; Si BUFFER_SIZE es potencia de 2
; O con rotación para no-potencia-de-2 (complejo)

Reversión de bits simple (8 bits en AL)

mov cl, 8
.rev: ror al, 1
      rcl bl, 1
      loop .rev ; Resultado en BL

Banderas afectadas

  • CF: Último bit desplazado/rotado (todas las instrucciones)
  • OF: Solo definido para desplazamientos de 1 bit (SHL/SAL: cambio de signo; SHR/SAR: borrado)
  • SF, ZF, PF: Actualizados según el resultado (desplazamientos/rotaciones)
  • AF: Indefinido

Variaciones de arquitectura

  • ARM: LSL, LSR, ASR, ROR, RRX (barril de desplazamiento en ALU — gratis con la mayoría de instrucciones)
  • MIPS: SLL, SRL, SRA, ROT (instrucción pseudo)
  • RISC-V: SLL, SRL, SRA, ROL, ROR (vía extensión Zbb)
  • 8086/8088: SHL, SHR, SAR, ROL, ROR, RCL, RCR (CL o 1 solo)

Nota de rendimiento

x86 moderno: desplazamientos/rotaciones tienen 1 ciclo de latencia, 0.25-0.5 de rendimiento. Los compiladores convierten automáticamente ×/÷ por potencias de 2. El uso manual se necesita para manipulación de bits, criptografía, compresión, gráficos.