STM |
Entrepose des registres multiples |
|---|---|
| ARM | |
Syntaxe
| STM{addr_mode}{cond} Rn{!}, reglist{^} |
Paramètres
| Nom | Description | |
|---|---|---|
| addr_mode | Ce paramètre optionnel permet d'indiquer le mode d'adressage mémoire à utiliser : | |
| Constante | Description | |
| IA | Cette constante permet d'indiquer une incrémentation d'adresse après chaque transfère. | |
| IB | Cette constante permet d'indiquer une incrémentation d'adresse avant chaque transfère (ARM seulement). | |
| DA | Cette constante permet d'indiquer une décrémentation d'adresse après chaque transfère (ARM seulement). | |
| DB | Cette constante permet d'indiquer une décrémentation d'adresse avant chaque transfère (pile descendante complète). | |
| cond | Ce paramètre optionnel permet d'indiquer le code de condition | |
| Rn | Ce paramètre permet d'indiquer le registre de base | |
| ! | Ce paramètre optionnel permet d'indiquer un suffixe indiquant que l'adresse final est inclus dans le déplacement écrit du paramètre Rn. | |
| reglist | Ce paramètre permet d'indiquer la liste des registres à entreposer. | |
| ^ | Ce paramètre optionnel permet d'indiquer qu'il faut transférer les données à l'intérieur ou l'extérieur des registres de mode utilisateur plutôt que dans les registres de modes courant. | |
Description
Cette instruction permet d'entreposer les registres multiples.
Remarques
- STM permet de stocker plusieurs registres en une seule instruction : L'instruction STM est très efficace pour sauvegarder l'état du processeur, notamment avant un appel de fonction ou lors d'une gestion d'interruption. En une seule instruction, on peut entreposer plusieurs registres (exemple : r0-r3, r14) en mémoire, ce qui économise du code et du temps d'exécution.
- Elle utilise des modes d'adressage très flexibles : Grâce à des variantes comme IA, IB, DA et DB, STM peut s'adapter à différentes logiques de pile ou de structures mémoire. Par exemple, STMFD (STM avec DB) est souvent utilisé pour empiler des données sur une pile descendante avec adresse avant-décrémentée, classique dans l'environnement ARM.
- Le mode Rn! modifie le pointeur de base : Le point d'exclamation ! indique que le registre de base Rn doit être mis à jour après l'opération. Cela est utile pour gérer des structures en mémoire ou avancer dans une pile sans avoir à faire une instruction supplémentaire pour incrémenter manuellement Rn.
- L'ordre des registres dans reglist est toujours croissant : Peu importe l'ordre dans lequel les registres sont écrits dans la reglist, ARM va les entreposer en ordre croissant d'index, sauf si l'architecture cible a une variation spécifique. Cela garantit un comportement prévisible en mémoire, pratique pour restaurer plus tard avec LDM.
- Le suffixe ^ permet des accès inter-mode (User vs. System) : Avec le symbole ^, STM peut copier les registres du mode utilisateur, même si le CPU est en mode superviseur (ex. en gestion d'interruption). C'est très utile pour sauvegarder/restaurer des contextes utilisateur dans des systèmes multitâches ou des OS temps réel.
- Très performant pour le contexte multitâche : Dans les systèmes d'exploitation ARM ou embarqués, STM est largement utilisé pour sauvegarder rapidement l'état du contexte d'un thread/processus, avant un changement de contexte. Cette rapidité est due à sa capacité à manipuler plusieurs registres d'un coup.
- L'association avec LDM est fréquente : Souvent, STM est utilisé avec LDM (Load Multiple) pour sauvegarder/restaurer une configuration complète de registres. Par exemple, STMFD sp!, {r4-r11, lr} suivi plus tard par LDMFD sp!, {r4-r11, lr} dans une routine de fonction pour préserver l'état local.
- Attention aux conflits avec le registre de base : Le registre Rn (base) ne doit pas faire partie de la reglist, sauf si l'on comprend bien les effets secondaires. Si on entrepose Rn tout en le modifiant (!), cela peut provoquer des résultats non intuitifs, car sa valeur changera pendant l'opération d'entreposage.
Dernière mise à jour : Dimanche, le 12 novembre 2017