Lors du portage de systèmes temps réel comme RT-Thread, une compréhension des opérations d'assemblage est essentielle, notamment pour gérer les conetxtes lors des changements de tâche ou la gestion des interruptions. Les documents techniques liés à GCC ou aux microcontrôleurs STM32 incluent souvent des extraits en langage assembleur. Voici donc un aperçu clair et concis des instructions ARM couramment utilisées.
Rgeistres d'état : CPSR et SPSR
Le registre CPSR (Current Program Status Register) contient les indicateurs conditionnels (Z, N, C, V) et le mode du processeur. En mode exception, le SPSR (Saved Program Status Register) sauvegarde le CPSR avant basculement, permettant un retour propre après traitement.
mrs r0, cpsr ; Copie l'état actuel du CPSR dans le registre r0
msr cpsr, r0 ; Restaure l'état du CPSR depuis r0
Gestion de la pile avec FD (Full Descending)
Sur ARM, la pile croît vers des adresses décroissantes. Les instructions stmfd (store multiple full descending) et ldmfd (load multiple full descending) sont utilisées pour empiler/dépiler plusieurs registres.
stmfd sp!, {r0-r3, lr} ; Sauvegarde r0-r3 et lr sur la pile, ajuste SP
ldmfd sp!, {r0-r3, pc} ; Restaure les registres, y compris PC (retour)
Transfert de données : MOV, LDR, STR
L'instruction mov déplace une valeur entre registres ou charge une constante immédiate.
mov r1, r2 ; r1 ← r2
mov r1, #1024 ; r1 ← 1024
ldr peut être une pseudo-instruction quand elle inclut =, permettant de charger des constantes trop grandes pour un champ immédiat direct.
ldr r1, =0x20001000 ; Charge une adresse constante (via pool littéral)
ldr r1, [r2, #4] ; Charge la valeur située à (r2 + 4)
ldr r1, [r2], #4 ; Charge depuis r2, puis incrémente r2 de 4
str écrit une valeur en mémoire.
str r1, [r2, #4] ; Stocke r1 à l'adresse r2 + 4
str r1, [r2], #8 ; Stocke r1 à r2, puis met à jour r2 ← r2 + 8
Opérations arithmétiques et logiques
Les instructions classiques incluent addition (add) et soustraction (sub).
add r1, r2, #5 ; r1 ← r2 + 5
sub r1, r2, r3 ; r1 ← r2 - r3
Pour les opérations binaires :
and r1, r2, r3 ; r1 ← r2 & r3
orr r1, r1, #0xF ; Met les 4 bits de poids faible à 1
ands r0, r0, #1 ; Et logique + mise à jour des flags (Z si résultat nul)
Le suffixe s indique que les indicateurs du CPSR doivent être mis à jour après exécution.
Comparaison et sauts conditionnels
cmp effectue une comapraison implicite en soustrayant deux valeurs et en mettant à jour les drapeaux.
cmp r1, r2 ; Compare r1 et r2 (définit Z, N, etc.)
beq label ; Branchement si égal (Z=1)
bne label ; Branchement si différent
blo label ; Branchement si inférieur (unsigned)
Les instructions conditionnelles peuvent aussi affecter d'autres opérations :
ldreq r1, [r2] ; Charge seulement si égal
strlo r1, [r2] ; Stocke seulement si inférieur (unsigned)
Sauts et appel de fonction
b réalise un saut inconditionnel.
b loop_start
bl appelle une sous-routine en sauvegardant l'adresse de retour dans LR (Link Register).
bl my_function ; Appel, LR ← adresse suivante
mov pc, lr ; Retour depuis la fonction
bx permet un saut avec changement d'état (ARM/Thumb), selon la valeur du bit 0 de la cible.
bx lr ; Retour avec détection automatique du mode d'exécution
Décalages logiques et arithmétiques
Les décalages sont fréquents pour manipuler des champs binaires.
lsl r1, r2, #2 ; r1 ← r2 << 2 (logique à gauche)
lsr r1, r2, #4 ; r1 ← r2 >> 4 (logique à droite)
asr r1, r2, #3 ; r1 ← r2 >> 3 (arithmétique, signe préservé)
ror r1, r2, #5 ; r1 ← rotation droite de r2 de 5 bits
Références rapides
- SP : Stack Pointer – pointeur de pile
- LR : Link Register – stocke les retours de fonction
- PC : Program Counter – adresse de l'instruction en cours
- ALU : Unité Arithmétique et Logique
- SWI : Instruction de logiciel d'interruption (appel système)
- FIQ/IRQ : Gestion des interruptions rapides et standard