7. Instrukcje rozgałęzień¶
Powodują one przeskok wykonywania do lokalizacji docelowej zwykle określonej przez etykietę (zobacz dyrektywę assemblerową label()). Rozgałęzienia warunkowe oraz instrukcje it i ite testują flagi N (negative), Z (zero), C (carry) i V (overflow) rejestru stanu programu aplikacji (APSR), aby określić, czy rozgałęzienie powinno zostać wykonane.
Większość udostępnionych instrukcji assemblerowych (w tym operacje przeniesienia) ustawia flagi, ale istnieją jawne instrukcje porównania umożliwiające testowanie wartości.
Dalsze szczegóły dotyczące znaczenia flag warunku znajdują się w sekcji instrukcje porównania.
7.1. Konwencje dokumentu¶
Notacja: Rm oznacza rejestry ARM R0-R15. LABEL oznacza etykietę zdefiniowaną dyrektywą assemblerową label(). <condition> wskazuje jeden z następujących specyfikatorów warunku:
eq Równy (wynik był zerem)
ne Nierówny
cs Przeniesienie ustawione
cc Przeniesienie wyczyszczone
mi Minus (ujemny)
pl Plus (dodatni)
vs Nadmiar ustawiony
vc Nadmiar wyczyszczony
hi > (porównanie bez znaku)
ls <= (porównanie bez znaku)
ge >= (porównanie ze znakiem)
lt < (porównanie ze znakiem)
gt > (porównanie ze znakiem)
le <= (porównanie ze znakiem)
7.2. Rozgałęzienie do etykiety¶
b(LABEL) Bezwarunkowe rozgałęzienie
beq(LABEL) rozgałęzienie, jeśli równe
bne(LABEL) rozgałęzienie, jeśli nierówne
bge(LABEL) rozgałęzienie, jeśli większe lub równe
bgt(LABEL) rozgałęzienie, jeśli większe
blt(LABEL) rozgałęzienie, jeśli mniejsze (<) (ze znakiem)
ble(LABEL) rozgałęzienie, jeśli mniejsze lub równe (<=) (ze znakiem)
bcs(LABEL) rozgałęzienie, jeśli flaga przeniesienia jest ustawiona
bcc(LABEL) rozgałęzienie, jeśli flaga przeniesienia jest wyczyszczona
bmi(LABEL) rozgałęzienie, jeśli ujemne
bpl(LABEL) rozgałęzienie, jeśli dodatnie
bvs(LABEL) rozgałęzienie, jeśli flaga nadmiaru jest ustawiona
bvc(LABEL) rozgałęzienie, jeśli flaga nadmiaru jest wyczyszczona
bhi(LABEL) rozgałęzienie, jeśli większe (bez znaku)
bls(LABEL) rozgałęzienie, jeśli mniejsze lub równe (bez znaku)
7.3. Długie rozgałęzienia¶
Kod produkowany przez wymienione powyżej instrukcje rozgałęzień używa stałej szerokości bitowej do określenia miejsca docelowego rozgałęzienia, które jest względne wobec PC. W konsekwencji w długich programach, gdzie instrukcja rozgałęzienia jest oddalona od swojego miejsca docelowego, assembler wygeneruje błąd „branch not in range”. Można to pokonać za pomocą „szerokich” wariantów, takich jak
beq_w(LABEL) długie rozgałęzienie, jeśli równe
Szerokie rozgałęzienia używają 4 bajtów do zakodowania instrukcji (w porównaniu z 2 bajtami dla standardowych instrukcji rozgałęzień).
7.4. Podprogramy (funkcje)¶
Wchodząc do podprogramu, procesor przechowuje adres powrotu w rejestrze r14, znanym również jako rejestr łącza (lr). Powrót do instrukcji po wywołaniu podprogramu jest wykonywany przez zaktualizowanie licznika programu (r15 lub pc) z rejestru łącza. Proces ten jest obsługiwany przez następujące instrukcje.
bl(LABEL)
Przenosi wykonywanie do instrukcji po LABEL, zapisując adres powrotu w rejestrze łącza (r14).
bx(Rm) Rozgałęzienie do adresu określonego przez Rm.
Zazwyczaj bx(lr) jest wydawana w celu powrotu z podprogramu. W przypadku zagnieżdżonych podprogramów rejestr łącza zewnętrznych zakresów musi zostać zapisany (zwykle na stosie) przed wykonaniem wywołań wewnętrznych podprogramów.