7. Branch-instructies

Deze zorgen ervoor dat de uitvoering springt naar een doellocatie die doorgaans wordt gespecificeerd door een label (zie de label() assembler-directive). Voorwaardelijke branches en de it- en ite-instructies testen de N- (negatief), Z- (nul), C- (carry) en V- (overflow) vlaggen van het Application Program Status Register (APSR) om te bepalen of de branch moet worden uitgevoerd.

De meeste blootgestelde assembler-instructies (waaronder move-operaties) zetten de vlaggen, maar er zijn expliciete vergelijkingsinstructies om waarden te kunnen testen.

Verdere details over de betekenis van de conditievlaggen worden gegeven in de sectie vergelijkingsinstructies.

7.1. Documentconventies

Notatie: Rm duidt de ARM-registers R0-R15 aan. LABEL duidt een label aan dat is gedefinieerd met de label() assembler-directive. <condition> geeft een van de volgende conditie-specificeerders aan:

  • eq Gelijk aan (resultaat was nul)

  • ne Niet gelijk

  • cs Carry gezet

  • cc Carry gewist

  • mi Min (negatief)

  • pl Plus (positief)

  • vs Overflow gezet

  • vc Overflow gewist

  • hi > (unsigned vergelijking)

  • ls <= (unsigned vergelijking)

  • ge >= (signed vergelijking)

  • lt < (signed vergelijking)

  • gt > (signed vergelijking)

  • le <= (signed vergelijking)

7.2. Branch naar label

  • b(LABEL) Onvoorwaardelijke branch

  • beq(LABEL) branch indien gelijk

  • bne(LABEL) branch indien niet gelijk

  • bge(LABEL) branch indien groter dan of gelijk aan

  • bgt(LABEL) branch indien groter dan

  • blt(LABEL) branch indien kleiner dan (<) (signed)

  • ble(LABEL) branch indien kleiner dan of gelijk aan (<=) (signed)

  • bcs(LABEL) branch indien de carry-vlag gezet is

  • bcc(LABEL) branch indien de carry-vlag gewist is

  • bmi(LABEL) branch indien negatief

  • bpl(LABEL) branch indien positief

  • bvs(LABEL) branch indien de overflow-vlag gezet is

  • bvc(LABEL) branch indien de overflow-vlag gewist is

  • bhi(LABEL) branch indien hoger (unsigned)

  • bls(LABEL) branch indien lager of gelijk (unsigned)

7.3. Lange branches

De code die door de hierboven genoemde branch-instructies wordt geproduceerd, gebruikt een vaste bitbreedte om de branch-bestemming te specificeren, die PC-relatief is. Bijgevolg zal de assembler in lange programma’s, waar de branch-instructie ver van zijn bestemming verwijderd is, een “branch not in range”-fout produceren. Dit kan worden omzeild met de “wide”-varianten zoals

  • beq_w(LABEL) lange branch indien gelijk

Wide-branches gebruiken 4 bytes om de instructie te coderen (vergeleken met 2 bytes voor standaard branch-instructies).

7.4. Subroutines (functies)

Bij het binnengaan van een subroutine slaat de processor het retouradres op in register r14, ook wel bekend als het link-register (lr). Het terugkeren naar de instructie na de subroutine-aanroep gebeurt door de program counter (r15 of pc) bij te werken vanuit het link-register. Dit proces wordt afgehandeld door de volgende instructies.

  • bl(LABEL)

Draag de uitvoering over aan de instructie na LABEL en sla het retouradres op in het link-register (r14).

  • bx(Rm) Branch naar het adres dat door Rm wordt gespecificeerd.

Doorgaans wordt bx(lr) uitgevoerd om terug te keren uit een subroutine. Voor geneste subroutines moet het link-register van de buitenste scopes (meestal op de stack) worden opgeslagen voordat aanroepen van binnenste subroutines worden uitgevoerd.