Que sont les instructions de décalage et de rotation ?
Les instructions de décalage déplacent les bits d'un registre vers la gauche ou la droite. Cela peut être utile à diverses fins, telles que :
* Multiplier ou diviser par des puissances de 2
* Extraire ou insérer des bits spécifiques d'un registre
* Inverser l'ordre des bits dans un registre
Il existe deux principaux types d'instructions de décalage :les décalages logiques et les décalages arithmétiques.
* Changements logiques décale tous les bits d'un registre, y compris le bit de signe. Cela signifie que la valeur du registre peut changer après un décalage logique.
* Décalages arithmétiques décalez uniquement les bits de données dans un registre, pas le bit de signe. Cela signifie que la valeur du registre ne changera pas après un décalage arithmétique.
Le tableau suivant présente les différentes instructions de décalage disponibles dans la plupart des processeurs :
| Instructions | Descriptif |
|---|---|
| 'SHL' | Décalage logique vers la gauche |
| 'SHR' | Décalage logique vers la droite |
| `SAR` | Décalage arithmétique vers la droite |
| `ROL` | Faire pivoter à gauche |
| `ROR` | Faire pivoter à droite |
Instructions de rotation
Les instructions de rotation sont similaires aux instructions de décalage, sauf qu'elles font tourner les bits d'un registre au lieu de les décaler. Cela signifie que les bits à une extrémité du registre se déplaceront vers l'autre extrémité.
Les instructions de rotation peuvent être utiles à diverses fins, telles que :
* Génération de tampons circulaires
* Échanger le contenu de deux registres
* Implémentation de certains algorithmes cryptographiques
Le tableau suivant présente les différentes instructions de rotation disponibles dans la plupart des processeurs :
| Instructions | Descriptif |
|---|---|
| `ROL` | Faire pivoter à gauche |
| `ROR` | Faire pivoter à droite |
Exemples
Voici quelques exemples d’utilisation des instructions de déplacement et de rotation :
* Pour multiplier un nombre par 2, vous pouvez utiliser une instruction de décalage vers la gauche. Par exemple, le code suivant multiplie la valeur du registre « EAX » par 2 :
```
shl eax, 1
```
* Pour diviser un nombre par 2, vous pouvez utiliser une instruction de décalage vers la droite. Par exemple, le code suivant divise la valeur du registre « EAX » par 2 :
```
shr eax, 1
```
* Pour extraire l'octet de poids faible d'un registre, vous pouvez utiliser une instruction de décalage vers la droite. Par exemple, le code suivant extrait l'octet de poids faible du registre « EAX » et le stocke dans le registre « AL » :
```
shr eax, 8
mov al, eax
```
* Pour insérer un octet spécifique dans un registre, vous pouvez utiliser une instruction de décalage vers la gauche. Par exemple, le code suivant insère la valeur 0x12 dans l'octet de poids faible du registre `EAX` :
```
mouvement, 0x12
shl eax, 8
```
* Pour inverser l'ordre des bits dans un registre, vous pouvez utiliser une instruction de rotation à gauche. Par exemple, le code suivant inverse l'ordre des bits dans le registre « EAX » :
```
rouleau eax, 8
```