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ón | Operación | CF | OF | Caso de uso |
|---|---|---|---|---|
| SHL r, cl/imm | r ← r << n | Último bit desplazado | Se establece si cambia el signo (desplazamiento de 1 bit) | Multiplicación rápida sin signo ×2ⁿ |
| SHR r, cl/imm | r ← r >> n (relleno con cero) | Último bit desplazado | Se establece si cambia el signo (desplazamiento de 1 bit) | División rápida sin signo ÷2ⁿ |
| SAR r, cl/imm | r ← r >> n (relleno con signo) | Último bit desplazado | Siempre 0 | Divisió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.
- ·Cómo programar un mando universal Verizon para televisión
- ·¿Puede el Control Remoto de un Vecino Controlar el Volumen de Mi TV?
- ·Soportes motorizados para TV: Ajuste altura y ángulo con control remoto
- ·Cómo Hacer que un Botón Pulsador Conmute un LED en PICAXE
- ·Cómo programar mando RC27A (RCA)
- ·Cómo programar mando RCA RCR815 para DirecTV H20
- ·Programar mando universal Lax-Max a TV Panasonic
- ·Programar dispositivos auxiliares/externos en un control remoto de DISH Network
- Cómo programar mando Comcast para TV Akai Plasma
- Cómo programar mando Brighthouse para sistema Bose 321 (códigos: 070, 170, 224, 347, 409, 460)
- Cómo programar el mando Motorola DCT6200 para un nuevo TV
- Configurar Temporizador Apagado (Sleep Timer) TV Emerson con Mando Universal Jumbo
- Cómo programar mi control remoto de televisión
- Cómo se comunican los controles remotos con los televisores: IR vs. Bluetooth
