ASR |
Décalage arithmétique vers la droite |
| ARM |
Syntaxe
|
ASR{S}{cond} Rd, Rm, Rs
|
|
ASR{S}{cond} Rd, Rm, #sh
|
Paramètres
| Nom |
Description |
| S |
Ce paramètre optionnel permet d'indiquer le suffixe. Si ce paramètre est spécifié, les drapeaux de condition sont mise à jour dans le résultat de l'opérande |
| cond |
Ce paramètre optionnel permet d'indiquer le code de condition |
| Rd |
Ce paramètre permet d'indiquer le registre de destination. |
| Rm |
Ce paramètre permet d'indiquer le registre contenant le premier opérande. Cet opérande est décalé vers la droite. |
| Rs |
Ce paramètre permet d'indiquer une valeur de décalage à appliquer à valeur du paramètre Rm. Seul l'octet de poids le plus faible est utilisé. |
| #sh |
Ce paramètre permet d'indiquer une constante de décalage. Les valeurs doit être situé entre 1 et 32. |
Description
Cette instruction permet d'effectuer le décalage arithmétique de bits vers la droite.
Remarques
- Décalage arithmétique à droite dépendant d'un registre : L'instruction ASR (Arithmetic Shift Right) permet de décaler un registre vers
la droite tout en conservant le bit de signe (bit de poids fort), ce qui est essentiel pour les entiers signés. Ce décalage est variable : il est déterminé par la
valeur contenue dans un second registre (Wm ou Xm selon la taille).
- Alias de l'instruction ASRV : ASR est en fait un alias d'ASRV, ce qui signifie que son comportement, son encodage et sa sémantique sont exactement les
mêmes. Cependant, l'utilisation de l'alias ASR permet d'avoir une syntaxe assembleur plus lisible et intuitive, notamment lors du désassemblage.
- Préserve le bit de signe pour les entiers signés : Le décalage effectué par ASR est arithmétique : cela signifie que le bit inséré à gauche (lors du
décalage) est une copie du bit de signe. Ce comportement est crucial pour maintenir la valeur signée correcte, contrairement à un décalage logique qui insère des
zéros.
- Le décalage est modulé selon la taille du registre : La quantité de bits à décaler est déterminée en prenant la valeur du second registre modulo 32 pour
les registres 32 bits et modulo 64 pour les registres 64 bits. Cela évite les débordements et garantit un comportement défini, même si le registre contient une valeur
supérieure à la taille du mot.
- Aucune version immédiate de cette instruction : Contrairement à certaines autres instructions de décalage (LSR, ASR,...), cette version ne prend pas
de valeur immédiate comme paramètre de décalage. Elle repose uniquement sur la valeur contenue dans un second registre, ce qui rend son comportement plus dynamique, mais
exige une gestion préalable des registres.
- Utile pour les opérations de division par puissances de deux : L'instruction ASR est très utile lorsqu'on souhaite diviser un entier signé par une
puissance de deux, car elle conserve le signe. Par exemple, ASR X1, X0, X2 divise approximativement le contenu de X0 par 2^X2, avec un arrondi vers l'inférieur si X0 est
négatif.
- Encodage spécifique dans l'ensemble d'instructions : L'encodage binaire de cette instruction utilise un schéma particulier dans les bits de poids
fort (sf=0 ou 1, bits 31 à 21) pour la distinguer. Elle appartient à la famille des instructions de traitement logique avec registre décalé, mais son motif est unique,
ce qui permet un décodage efficace par les processeurs ARM.
- Aucune modification des drapeaux de condition : L'instruction ASR (comme ASRV) ne modifie pas les indicateurs de statut (NZCV) du processeur. Elle est donc
utilisée lorsque l'on veut uniquement effectuer un décalage sans influencer les conditions d'un éventuel branchement conditionnel. Pour cela, on utiliserait l'instruction
ASRS.
Dernière mise à jour : Dimanche, le 12 novembre 2017