Instruções de shift e rotate são operações bitwise fundamentais que manipulam conteúdo de registradores no nível binário. São essenciais para aritmética eficiente, bit packing, criptografia e programação de sistemas de baixo nível.
Instruções de Shift
Movem bits para esquerda ou direita, descartando bits que caem no final (exceto nas flags).
Shifts Lógicos
- SHL / SAL (Shift Left Logical/Arithmetic): Bits deslocam para MSB. LSB preenchido com 0. MSB → Carry Flag (CF). Multiplicação unsigned por 2ⁿ.
- SHR (Shift Right Logical): Bits deslocam para LSB. MSB preenchido com 0. LSB → CF. Divisão unsigned por 2ⁿ.
Shifts Aritméticos
- SAR (Shift Right Arithmetic): Bits deslocam para LSB. MSB replicado (extensão de sinal). LSB → CF. Divisão signed por 2ⁿ (arredonda para -∞).
Resumo Instruções de Shift (x86)
| Instrução | Operação | CF | OF | Caso de Uso |
| SHL r, cl/imm | r ← r << n | Último bit deslocado | Set se sinal muda (shift 1-bit) | Rápido unsigned ×2ⁿ |
| SHR r, cl/imm | r ← r >> n (zero-fill) | Último bit deslocado | Set se sinal muda (shift 1-bit) | Rápido unsigned ÷2ⁿ |
| SAR r, cl/imm | r ← r >> n (sign-fill) | Último bit deslocado | Sempre 0 | Rápido signed ÷2ⁿ |
Instruções de Rotate
Bits dão volta — nenhum bit perdido. CF captura bit que cruza fronteira.
Tipos
- ROL (Rotate Left): MSB → LSB e CF
- ROR (Rotate Right): LSB → MSB e CF
- RCL (Rotate Through Carry Left): CF → LSB, MSB → CF (rotate n+1 bits)
- RCR (Rotate Through Carry Right): CF → MSB, LSB → CF (rotate n+1 bits)
Exemplos Práticos (x86 Assembly)
Multiplicar EAX por 8
shl eax, 3 ; EAX *= 8 (2^3)
Dividir EAX por 4 (unsigned)
shr eax, 2 ; EAX /= 4
Dividir EAX por 4 (signed)
sar eax, 2 ; Preserva sinal
Extrair Byte Baixo para AL
movzx eax, al ; Ou: and eax, 0xFF
Inserir Valor nos Bits 8-15
shl eax, 8 ; Move bits existentes 8-15 para 16-23
mov al, 0x12 ; Insere novo byte baixo (exemplo)
; Melhor: and eax, 0xFFFF00FF; or eax, (0x12 << 8)
Trocar High/Low 16 Bits de EAX
rol eax, 16 ; Rotate 32-bit
Índice Buffer Circular (Módulo Potência de 2)
inc edi
and edi, BUFFER_SIZE-1 ; Se BUFFER_SIZE é potência de 2
; Ou com rotate para non-power-of-2 (complexo)
Reversão Simples de Bits (8-bit em AL)
mov cl, 8
.rev:
ror al, 1
rcl bl, 1
loop .rev ; Resultado em BL
Flags Afetadas
- CF: Último bit deslocado/rotacionado para fora (todas instruções)
- OF: Definida apenas para shifts de 1-bit (SHL/SAL: mudança de sinal; SHR/SAR: zerada)
- SF, ZF, PF: Atualizadas conforme resultado (shifts/rotates)
- AF: Indefinida
Variações de Arquitetura
- ARM: LSL, LSR, ASR, ROR, RRX (barrel shifter na ALU — livre com a maioria instruções)
- MIPS: SLL, SRL, SRA, ROT (pseudo-instrução)
- RISC-V: SLL, SRL, SRA, ROL, ROR (via extensão Zbb)
- 8086/8088: SHL, SHR, SAR, ROL, ROR, RCL, RCR (CL ou 1 apenas)
Nota de Performance
x86 moderno: Shifts/rotates são latência 1-ciclo, throughput 0,25-0,5. Compiladores auto-convertem ×/÷ por potências de 2. Uso manual necessário para manipulação de bits, criptografia, compressão, gráficos.