Istruzioni di Shift e Rotate in Linguaggio Assembly: Riferimento Completo
Le istruzioni di shift e rotate sono operazioni bitwise fondamentali che manipolano il contenuto dei registri a livello binario. Sono essenziali per aritmetica efficiente, impacchettamento bit, crittografia e programmazione di sistemi di basso livello.
Istruzioni di Shift
Spostano bit a sinistra o destra, scartando i bit che cadono dall'estremo (tranne che nei flag).
Shift Logici
- SHL / SAL (Shift Left Logical/Arithmetic): I bit si spostano verso il bit più significativo (MSB). LSB riempito con 0. MSB → Carry Flag (CF). Moltiplicazione non segnata per 2ⁿ.
- SHR (Shift Right Logical): I bit si spostano verso il bit meno significativo (LSB). MSB riempito con 0. LSB → CF. Divisione non segnata per 2ⁿ.
Shift Aritmetici
- SAR (Shift Right Arithmetic): I bit si spostano verso LSB. MSB replicato (estensione del segno). LSB → CF. Divisione segnata per 2ⁿ (arrotonda verso -∞).
Riepilogo Istruzioni di Shift (x86)
| Istruzione | Operazione | CF | OF | Caso d'uso |
|---|---|---|---|---|
| SHL r, cl/imm | r ← r << n | Ultimo bit spostato fuori | Impostato se cambia segno (shift 1 bit) | Moltiplicazione non segnata ×2ⁿ rapida |
| SHR r, cl/imm | r ← r >> n (zero-fill) | Ultimo bit spostato fuori | Impostato se cambia segno (shift 1 bit) | Divisione non segnata ÷2ⁿ rapida |
| SAR r, cl/imm | r ← r >> n (sign-fill) | Ultimo bit spostato fuori | Sempre 0 | Divisione segnata ÷2ⁿ rapida |
Istruzioni di Rotate
I bit si avvolgono—nessun bit perso. CF cattura il bit che attraversa il confine.
Tipi
- ROL (Rotate Left): MSB → LSB e CF
- ROR (Rotate Right): LSB → MSB e CF
- RCL (Rotate Through Carry Left): CF → LSB, MSB → CF (rotazione n+1 bit)
- RCR (Rotate Through Carry Right): CF → MSB, LSB → CF (rotazione n+1 bit)
Esempi Pratici (Assembly x86)
Moltiplica EAX per 8
shl eax, 3 ; EAX *= 8 (2^3)
Dividi EAX per 4 (non segnato)
shr eax, 2 ; EAX /= 4
Dividi EAX per 4 (segnato)
sar eax, 2 ; Preserva segno
Estrai Byte Basso in AL
movzx eax, al ; O: and eax, 0xFF
Inserisci Valore nei Bit 8-15
shl eax, 8 ; Sposta bit esistenti 8-15 a 16-23 mov al, 0x12 ; Inserisci nuovo byte basso (esempio) ; Meglio: and eax, 0xFFFF00FF; or eax, (0x12 << 8)
Scambia Bit Alti/Bassi 16 di EAX
rol eax, 16 ; Rotazione 32-bit
Indice Buffer Circolare (Modulo Potenza di 2)
inc edi and edi, BUFFER_SIZE-1 ; Se BUFFER_SIZE è potenza di 2 ; O con rotate per non-potenza-di-2 (complesso)
Inversione Bit Semplice (8-bit in AL)
mov cl, 8 .rev: ror al, 1 rcl bl, 1 loop .rev ; Risultato in BL
Flag Influenzati
- CF: Ultimo bit spostato/rotato fuori (tutte le istruzioni)
- OF: Definito solo per shift di 1 bit (SHL/SAL: cambio segno; SHR/SAR: azzerato)
- SF, ZF, PF: Aggiornati in base al risultato (shift/rotate)
- AF: Indefinito
Variazioni per Architettura
- ARM: LSL, LSR, ASR, ROR, RRX (barrel shifter in ALU—gratis con la maggior parte delle istruzioni)
- MIPS: SLL, SRL, SRA, ROT (pseudo-istruzione)
- RISC-V: SLL, SRL, SRA, ROL, ROR (tramite estensione Zbb)
- 8086/8088: SHL, SHR, SAR, ROL, ROR, RCL, RCR (CL o 1 solo)
Nota Prestazioni
x86 moderno: Shift/rotate hanno 1 ciclo di latenza, 0.25-0.5 throughput. I compilatori convertono automaticamente ×/÷ per potenze di 2. L'uso manuale è necessario per manipolazione bit, crittografia, compressione, grafica.