Syntaxe
Paramètres
| Nom |
Description |
| cond |
Ce paramètre optionnel permet d'indiquer le code de condition |
| reglist |
Ce paramètre permet d'indiquer la liste des registres à empiler entre accolade. |
Description
Cette instruction permet d'empiler des registres d'une pile descendante complète.
Remarques
- PUSH sert à sauvegarder le contenu de registres sur la pile : L'instruction PUSH place une ou plusieurs valeurs des registres dans la pile. Elle
est très utilisée au début d'une fonction pour préserver l'état des registres utilisés, afin d'éviter de modifier accidentellement des données importantes.
- La pile ARM est descendante, donc SP est décrémenté : Lors d'un PUSH, la pile grandit vers les adresses mémoire plus basses. Chaque enregistrement
dans la pile décrémente le pointeur de pile (SP), ce qui signifie que la mémoire est utilisée en sens inverse.
- reglist permet de spécifier plusieurs registres à empiler : Le paramètre reglist est une liste entre accolades de registres : {r4, r5, lr},
par exemple. Cela permet d'enregistrer plusieurs registres en une seule instruction, ce qui est rapide et optimisé en mémoire.
- PUSH ne modifie pas les drapeaux du registre d'état : Contrairement à certaines instructions comme SUBS ou MOVS, PUSH ne met pas à jour les drapeaux
(Z, N, C, V) du registre d'état CPSR. Cela le rend sûr à utiliser dans des contextes critiques sans impacter le flux d'exécution conditionnel.
- PC ne peut pas être utilisé dans un PUSH : Il est interdit d'inclure le registre PC (program counter) dans une liste PUSH. Cela pourrait causer
des comportements inattendus car sauvegarder l'adresse d'exécution courante dans la pile n'a pas d'usage cohérent dans ce contexte.
- Instruction conditionnelle grâce au suffixe {cond} : Comme la majorité des instructions ARM, PUSH peut être conditionnelle : par exemple PUSHNE {r4, r5}
n'empile les registres que si le dernier résultat n'était pas égal à zéro. Cela permet des optimisations dans des blocs de code dépendant de conditions.
- Utilisation typique pour les fonctions et interruptions : Dans une routine standard, PUSH est utilisé dès le début pour sauvegarder les registres
modifiés dans la fonction, souvent suivi d'un POP à la fin. Il est également très utile dans les gestionnaires d'interruptions pour préserver le contexte du système.
- L'ordre d'empilement est toujours croissant : Même si les registres dans reglist sont spécifiés dans n'importe quel ordre, l'instruction PUSH les écrit
dans la pile dans l'ordre croissant (par numéro de registre), ce qui assure un comportement prévisible lors du POP correspondant.
Dernière mise à jour : Dimanche, le 12 novembre 2017