Instructions décalage et rotation en langage assembleur : Référence complète
Les instructions de décalage (shift) et rotation (rotate) sont des opérations bitwise fondamentales qui manipulent contenus registres au niveau binaire. Essentielles pour arithmétique efficace, compactage bits, cryptographie, programmation bas niveau systèmes.
Instructions décalage (Shift)
Déplacent bits gauche ou droite, jettent bits qui tombent au bout (sauf dans flags).
Décalages logiques
- SHL / SAL (Shift Left Logical/Arithmetic) : Bits vers MSB. LSB rempli 0. MSB → Drapeau Retenue (CF). Multiplication non-signée par 2ⁿ.
- SHR (Shift Right Logical) : Bits vers LSB. MSB rempli 0. LSB → CF. Division non-signée par 2ⁿ.
Décalages arithmétiques
- SAR (Shift Right Arithmetic) : Bits vers LSB. MSB **reproduit** (extension signe). LSB → CF. Division signée par 2ⁿ (arrondi vers -∞).
Résumé instructions décalage (x86)
| Instruction | Opération | CF | OF | Cas d'usage |
|---|---|---|---|---|
| SHL r, cl/imm | r ← r << n | Dernier bit décalé sorti | Set si changement signe (décalage 1 bit) | Rapide ×2ⁿ non-signé |
| SHR r, cl/imm | r ← r >> n (remplissage zéro) | Dernier bit décalé sorti | Set si changement signe (décalage 1 bit) | Rapide ÷2ⁿ non-signé |
| SAR r, cl/imm | r ← r >> n (remplissage signe) | Dernier bit décalé sorti | Toujours 0 | Rapide ÷2ⁿ signé |
Instructions rotation (Rotate)
Bits s'enroulent — aucun bit perdu. CF capture bit traversant frontière.
Types
- ROL (Rotate Left) : MSB → LSB et CF
- ROR (Rotate Right) : LSB → MSB et CF
- RCL (Rotate Through Carry Left) : CF → LSB, MSB → CF (rotation n+1 bits)
- RCR (Rotate Through Carry Right) : CF → MSB, LSB → CF (rotation n+1 bits)
Exemples pratiques (Assembleur x86)
Multiplier EAX par 8
shl eax, 3 ; EAX *= 8 (2^3)
Diviser EAX par 4 (non-signé)
shr eax, 2 ; EAX /= 4
Diviser EAX par 4 (signé)
sar eax, 2 ; Préserve signe
Extraire octet poids faible vers AL
movzx eax, al ; Ou : and eax, 0xFF
Insérer valeur bits 8-15
shl eax, 8 ; Déplace bits existants 8-15 vers 16-23 mov al, 0x12 ; Insère nouvel octet poids faible (exemple) ; Mieux : and eax, 0xFFFF00FF; or eax, (0x12 << 8)
Échanger poids fort/faible 16 bits EAX
rol eax, 16 ; Rotation 32 bits
Index tampon circulaire (Modulo puissance 2)
inc edi and edi, BUFFER_SIZE-1 ; Si BUFFER_SIZE puissance de 2 ; Ou rotation pour non-puissance-2 (complexe)
Inversion bits simple (8 bits dans AL)
mov cl, 8 .rev: ror al, 1 rcl bl, 1 loop .rev ; Résultat dans BL
Drapeaux affectés
- CF : Dernier bit décalé/roté sorti (toutes instructions)
- OF : Défini seulement pour décalages 1 bit (SHL/SAL: changement signe; SHR/SAR: cleared)
- SF, ZF, PF : Mis à jour selon résultat (décalages/rotations)
- AF : Indéfini
Variations architectures
- ARM : LSL, LSR, ASR, ROR, RRX (barrel shifter dans ALU — gratuit avec la plupart instructions)
- MIPS : SLL, SRL, SRA, ROT (pseudo-instruction)
- RISC-V : SLL, SRL, SRA, ROL, ROR (via extension Zbb)
- 8086/8088 : SHL, SHR, SAR, ROL, ROR, RCL, RCR (CL ou 1 seulement)
Note performance
x86 moderne : Décalages/rotations 1 cycle latence, débit 0,25-0,5. Compilateurs auto-convertissent ×/÷ puissances de 2. Usage manuel requis pour manipulation bits, crypto, compression, graphiques.
