7. Verzweigungsanweisungen

Diese bewirken, dass die Ausführung zu einem Zielort springt, der üblicherweise durch ein Label angegeben wird (siehe die Assembler-Direktive label()). Bedingte Verzweigungen sowie die Anweisungen it und ite prüfen die Flags N (negativ), Z (null), C (Carry) und V (Overflow) des Application Program Status Register (APSR), um zu bestimmen, ob die Verzweigung ausgeführt werden soll.

Die meisten der bereitgestellten Assembler-Anweisungen (einschließlich der Verschiebeoperationen) setzen die Flags, es gibt jedoch explizite Vergleichsanweisungen, um Werte zu prüfen.

Weitere Details zur Bedeutung der Bedingungs-Flags finden Sie im Abschnitt Vergleichsanweisungen.

7.1. Dokumentkonventionen

Notation: Rm bezeichnet die ARM-Register R0-R15. LABEL bezeichnet ein mit der Assembler-Direktive label() definiertes Label. <condition> gibt einen der folgenden Bedingungsspezifizierer an:

  • eq Gleich (Ergebnis war null)

  • ne Ungleich

  • cs Carry gesetzt

  • cc Carry gelöscht

  • mi Minus (negativ)

  • pl Plus (positiv)

  • vs Overflow gesetzt

  • vc Overflow gelöscht

  • hi > (vorzeichenloser Vergleich)

  • ls <= (vorzeichenloser Vergleich)

  • ge >= (vorzeichenbehafteter Vergleich)

  • lt < (vorzeichenbehafteter Vergleich)

  • gt > (vorzeichenbehafteter Vergleich)

  • le <= (vorzeichenbehafteter Vergleich)

7.2. Verzweigung zu Label

  • b(LABEL) Unbedingte Verzweigung

  • beq(LABEL) Verzweigung bei Gleichheit

  • bne(LABEL) Verzweigung bei Ungleichheit

  • bge(LABEL) Verzweigung bei größer als oder gleich

  • bgt(LABEL) Verzweigung bei größer als

  • blt(LABEL) Verzweigung bei kleiner als (<) (vorzeichenbehaftet)

  • ble(LABEL) Verzweigung bei kleiner als oder gleich (<=) (vorzeichenbehaftet)

  • bcs(LABEL) Verzweigung, wenn das Carry-Flag gesetzt ist

  • bcc(LABEL) Verzweigung, wenn das Carry-Flag gelöscht ist

  • bmi(LABEL) Verzweigung bei negativ

  • bpl(LABEL) Verzweigung bei positiv

  • bvs(LABEL) Verzweigung, wenn das Overflow-Flag gesetzt ist

  • bvc(LABEL) Verzweigung, wenn das Overflow-Flag gelöscht ist

  • bhi(LABEL) Verzweigung bei höher (vorzeichenlos)

  • bls(LABEL) Verzweigung bei niedriger oder gleich (vorzeichenlos)

7.3. Lange Verzweigungen

Der von den oben aufgeführten Verzweigungsanweisungen erzeugte Code verwendet eine feste Bit-Breite, um das Verzweigungsziel anzugeben, das PC-relativ ist. Folglich erzeugt der Assembler in langen Programmen, in denen die Verzweigungsanweisung weit von ihrem Ziel entfernt ist, einen „branch not in range“-Fehler. Dies kann mit den „wide“-Varianten wie

  • beq_w(LABEL) lange Verzweigung bei Gleichheit

Wide-Verzweigungen verwenden 4 Bytes zur Codierung der Anweisung (gegenüber 2 Bytes bei Standard-Verzweigungsanweisungen).

7.4. Subroutinen (Funktionen)

Beim Eintritt in eine Subroutine speichert der Prozessor die Rücksprungadresse im Register r14, auch bekannt als Link-Register (lr). Die Rückkehr zur Anweisung nach dem Subroutinen-Aufruf erfolgt durch Aktualisierung des Program Counter (r15 bzw. pc) aus dem Link-Register. Dieser Vorgang wird von den folgenden Anweisungen abgewickelt.

  • bl(LABEL)

Übergibt die Ausführung an die Anweisung nach LABEL und speichert die Rücksprungadresse im Link-Register (r14).

  • bx(Rm) Verzweigung zu der von Rm angegebenen Adresse.

Typischerweise wird bx(lr) verwendet, um aus einer Subroutine zurückzukehren. Bei verschachtelten Subroutinen muss das Link-Register äußerer Geltungsbereiche (üblicherweise auf dem Stack) gesichert werden, bevor innere Subroutinen-Aufrufe durchgeführt werden.