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.