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.