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.