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.