>> Tecnologia Eletrônica >  >> TVs >> Controles Remotos

Instruções de Shift e Rotate em Assembly Language: Referência Completa

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çãoOperaçãoCFOFCaso de Uso
SHL r, cl/immr ← r << nÚltimo bit deslocadoSet se sinal muda (shift 1-bit)Rápido unsigned ×2ⁿ
SHR r, cl/immr ← r >> n (zero-fill)Último bit deslocadoSet se sinal muda (shift 1-bit)Rápido unsigned ÷2ⁿ
SAR r, cl/immr ← r >> n (sign-fill)Último bit deslocadoSempre 0Rá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.