STR (déplacement de registre) |
Entreposage |
|---|---|
| ARM | |
Syntaxe
| STR{type}{cond} Rt, [Rn, ±Rm {, shift}] |
| STR{type}{cond} Rt, [Rn, ±Rm {, shift}]! |
| STR{type}{cond} Rt, [Rn], ±Rm {, shift} |
| STRD{cond} Rt, Rt2, [Rn, ±Rm] |
| STRD{cond} Rt, Rt2, [Rn, ±Rm]! |
| STRD{cond} Rt, Rt2, [Rn], ±Rm |
Paramètres
| Nom | Description | |
|---|---|---|
| type | Ce paramètre optionnel permet d'indiquer le type de données à appliquer : | |
| Constante | Description | |
| B | Cette constante permet d'indiquer un octet. | |
| H | Cette constante permet d'indiquer un demi-mot. | |
| - | Cette constante permet d'indiquer un mot. | |
| cond | Ce paramètre optionnel permet d'indiquer le code de condition. | |
| Rt | Ce paramètre permet d'indiquer un registre à entreposer | |
| Rn | Ce paramètre optionnel permet d'indiquer un registre sur lequel l'adresse mémoire est basé. | |
| Rm | Ce paramètre permet d'indiquer un registre contenu une valeur à utiliser comme déplacement. | |
| shift | Ce paramètre optionnel permet d'indiquer un décalage. | |
| Rt2 | Ce paramètre permet d'indiquer un registre additionnel où entreposer les opérations de double mot. | |
Description
Cette instruction permet d'entreposer un déplacement de registre, un déplacement de registre de pré-index, ou un déplacement de registre de postage d'index.
Remarques
- Accès mémoire flexible grâce à un déplacement dynamique : L'instruction permet de spécifier un déplacement variable via un registre (Rm), ce qui offre une grande flexibilité pour accéder à des adresses mémoire calculées dynamiquement. Cela est particulièrement utile dans les boucles manipulant des tableaux, où l'index évolue à chaque itération.
- Le champ shift ajoute une puissance de traitement supplémentaire : Le paramètre shift autorise un décalage sur le registre Rm avant son utilisation comme déplacement. Cela permet par exemple de multiplier Rm par une puissance de deux sans instruction supplémentaire, ce qui est utile dans les contextes de traitement de structures alignées comme les tableaux d'entiers.
- Le support des signes permet des accès dans les deux sens : Le fait que l'offset puisse être positif ou négatif (±Rm) donne la possibilité de naviguer aussi bien vers le haut que vers le bas en mémoire. C'est un mécanisme précieux pour implémenter efficacement des piles ascendantes ou descendantes, ou encore des itérations bidirectionnelles.
- Trois modes d'adressage : pré-indexé, post-indexé, ou implicite : Le support de plusieurs formes d'adressage permet à l'instruction d'être utilisée dans des contextes très variés : calcul anticipé de l'adresse (pré-indexé), mise à jour après stockage (post-indexé), ou sans modification du registre de base. Cela rend l'instruction particulièrement polyvalente dans la gestion mémoire.
- Le double mot avec STRD améliore la manipulation 64 bits : L'instruction STRD permet d'entreposer deux registres consécutifs (Rt et Rt2) d'un coup. Associée à un déplacement variable, elle est très utile pour manipuler des données 64 bits ou des paires de valeurs, ce qui optimise les performances dans les applications de traitement de données lourdes.
- Conditionnalité intégrée avec {cond} pour plus de contrôle : Comme toutes les instructions ARM classiques, STR peut être conditionnelle, ce qui permet d'intégrer un test logique sans ajout de branchement. Cela permet une exécution plus fluide et évite d'alourdir le code avec des structures conditionnelles complexes.
- Attention à l'alignement mémoire selon le type de données : Lorsque l'on utilise un offset dynamique, il est crucial de veiller à ce que les adresses résultantes soient alignées correctement, surtout pour des mots (32 bits) ou demi-mots (16 bits). Un mauvais alignement peut provoquer une exception ou ralentir fortement l'accès mémoire.
- Idéale pour les structures de données indexées : Cette instruction est parfaitement adaptée à la manipulation de structures comme des tableaux de structures, des matrices ou des buffers de données, grâce à la possibilité de calculer l'adresse de stockage en fonction d'un index contenu dans un registre.
Dernière mise à jour : Dimanche, le 12 novembre 2017