7. Instructions de branchement¶
Celles-ci provoquent un saut de l’exécution vers un emplacement cible généralement spécifié par une étiquette (voir la directive d’assembleur label()). Les branchements conditionnels et les instructions it et ite testent les drapeaux N (négatif), Z (zéro), C (retenue) et V (débordement) du registre d’état du programme d’application (APSR) afin de déterminer si le branchement doit être exécuté.
La plupart des instructions assembleur exposées (y compris les opérations de déplacement) positionnent les drapeaux, mais il existe des instructions de comparaison explicites permettant de tester des valeurs.
De plus amples détails sur la signification des drapeaux de condition sont fournis dans la section instructions de comparaison.
7.1. Conventions du document¶
Notation : Rm désigne les registres ARM R0-R15. LABEL désigne une étiquette définie avec la directive d’assembleur label(). <condition> indique l’un des spécificateurs de condition suivants :
eq Égal à (le résultat était zéro)
ne Différent de
cs Retenue positionnée
cc Retenue effacée
mi Moins (négatif)
pl Plus (positif)
vs Débordement positionné
vc Débordement effacé
hi > (comparaison non signée)
ls <= (comparaison non signée)
ge >= (comparaison signée)
lt < (comparaison signée)
gt > (comparaison signée)
le <= (comparaison signée)
7.2. Branchement vers une étiquette¶
b(LABEL) Branchement inconditionnel
beq(LABEL) branchement si égal
bne(LABEL) branchement si différent
bge(LABEL) branchement si supérieur ou égal
bgt(LABEL) branchement si supérieur
blt(LABEL) branchement si inférieur (<) (signé)
ble(LABEL) branchement si inférieur ou égal à (<=) (signé)
bcs(LABEL) branchement si le drapeau de retenue est positionné
bcc(LABEL) branchement si le drapeau de retenue est effacé
bmi(LABEL) branchement si négatif
bpl(LABEL) branchement si positif
bvs(LABEL) branchement si le drapeau de débordement est positionné
bvc(LABEL) branchement si le drapeau de débordement est effacé
bhi(LABEL) branchement si supérieur (non signé)
bls(LABEL) branchement si inférieur ou égal (non signé)
7.3. Branchements longs¶
Le code produit par les instructions de branchement listées ci-dessus utilise une largeur de bits fixe pour spécifier la destination du branchement, qui est relative au PC. Par conséquent, dans les longs programmes où l’instruction de branchement est éloignée de sa destination, l’assembleur produira une erreur « branch not in range ». On peut contourner cela avec les variantes « larges » telles que
beq_w(LABEL) branchement long si égal
Les branchements larges utilisent 4 octets pour encoder l’instruction (contre 2 octets pour les instructions de branchement standard).
7.4. Sous-routines (fonctions)¶
Lors de l’entrée dans une sous-routine, le processeur stocke l’adresse de retour dans le registre r14, également appelé registre de lien (lr). Le retour à l’instruction qui suit l’appel de la sous-routine s’effectue en mettant à jour le compteur de programme (r15 ou pc) à partir du registre de lien. Ce processus est géré par les instructions suivantes.
bl(LABEL)
Transfère l’exécution à l’instruction qui suit LABEL en stockant l’adresse de retour dans le registre de lien (r14).
bx(Rm) Branchement vers l’adresse spécifiée par Rm.
Typiquement, bx(lr) est émis pour revenir d’une sous-routine. Pour les sous-routines imbriquées, le registre de lien des portées externes doit être sauvegardé (généralement sur la pile) avant d’effectuer les appels de sous-routines internes.