Syntaxe
ADR {cond}{.W} register,expression
|
Paramètres
Nom |
Description |
cond |
Ce paramètre optionnel permet d'indiquer le code de condition |
.W |
Ce paramètre optionnel permet d'indiquer la largeur de l'instruction |
register |
Ce paramètre permet d'indiquer l'opérande recevant le résultat. L'opérande ne peut pas être PC et il peut seulement être SP si le registre de base est SP. |
expression |
Ce paramètre permet d'indiquer une expression de programme relatif ou d'un registre relatif évalué avec une fausse adresse de mot aligné sur 255 octets ou une adresse de mot aligné sur 1020 octets. |
Description
Cette instruction permet d'effectuer le chargement d'adresse de programme relatif ou de registre relatif dans un registre.
Algorithme
Remarques
- L'instruction ADR et l'adressage des vecteurs : L'instruction ADR est utilisée pour calculer des adresses vectorielles en combinant une base
d'adresses avec des décalages. Ces décalages peuvent être signés ou non, et sont multipliés par 2, 4 ou 8 avant d'être ajoutés à la base. Cela en fait une instruction
particulièrement utile dans les calculs d'adressage avancés pour des opérations vectorielles.
- Différents types d'encodages : L'instruction ADR dispose de trois encodages distincts :
Encodage |
Description |
Packed offsets |
Où les décalages sont stockés sous forme compacte. |
Unpacked 32-bit signed offsets |
Où les décalages sont des entiers signés de 32 bits. |
Unpacked 32-bit unsigned offsets |
Où les décalages sont des entiers non signés de 32 bits. Cette distinction permet d'adapter l'utilisation de l'instruction selon la nature des données et leur format. |
- Compatibilité avec SVE et restrictions en mode Streaming : L'instruction ADR est principalement destinée au Scalable Vector Extension (SVE). Elle
est illégale en mode Streaming SVE, sauf si la fonctionnalité FEAT_SME_FA64 est activée. Cette restriction est importante à prendre en compte lors de la programmation sur
des architectures ARM avancées.
- Utilisation de la mise à l'échelle des indices : ADR permet d'appliquer une mise à l'échelle aux indices en multipliant par 1, 2, 4 ou 8 grâce
au paramètre msz. Cela optimise l'accès à des tableaux ou structures de données en mémoire en s'alignant sur des tailles de données courantes (byte, half-word, word,
double-word).
- Interprétation des extensions de bits : Selon l'encodage utilisé, l'instruction ADR applique une extension de signe (SXTW) pour les décalages
signés et une extension de zéro (UXTW) pour les décalages non signés. Cela garantit que l'instruction peut être utilisée dans des contextes où la gestion correcte du signe
est essentielle.
- Encodage binaire spécifique et contraintes matérielles : L'encodage de l'instruction ADR repose sur des bits spécifiques pour déterminer la
taille des éléments (esize), la nature du décalage (osize), et l'interprétation du registre contenant les décalages (Zm). La lecture et la manipulation de ces bits
permettent de comprendre comment l'instruction fonctionne au niveau matériel.
- Effets sur les registres scalaires et vectoriels : L'instruction ADR travaille sur des registres vectoriels évolutifs (Zd, Zn, Zm). Le
registre Zd reçoit les adresses calculées, tandis que Zn fournit la base d'adresses et Zm contient les décalages. Cette organisation est essentielle pour les calculs
d'adresses dans les algorithmes vectoriels.
- Utilisation optimisée dans les applications SVE : En raison de sa nature vectorielle et de son optimisation pour l'adressage rapide, ADR est
particulièrement utile pour les algorithmes qui nécessitent le traitement simultané de plusieurs adresses. Cela inclut des domaines comme le traitement d'images,
l'IA et les calculs scientifiques, où l'accès rapide et structuré à la mémoire est critique.
Exemple
L'exemple suivant permet de calculer une adresse relative au compteur de programme (PC) et la stocker dans un registre. Voici donc un exemple
d'utilisation classique de ADR en assembleur ARM :
- .section .data
- message:
- .asciz "Bonjour, ARM!"
-
- .section .text
- .global _start
-
- _start:
- ADR x0, message ; Charge l'adresse de 'message' dans x0
- MOV x1, #13 ; Taille du message
- MOV x2, #1 ; Descripteur de fichier (1 = sortie standard)
- MOV x8, #64 ; Code système pour 'write' (sys_write)
- SVC 0 ; Appel système pour écrire
-
- MOV x8, #93 ; Code système pour 'exit' (sys_exit)
- MOV x0, #0 ; Code de retour 0
- SVC 0 ; Appel système pour quitter
Dernière mise à jour : Mardi, le 6 décembre 2016