7. Instrukcije grananja

One uzrokuju skok izvođenja na ciljnu lokaciju koja se obično specificira oznakom (vidi asemblersku direktivu label()). Uvjetna grananja te instrukcije it i ite testiraju zastavice N (negativno), Z (nula), C (prijenos) i V (preljev) registra stanja aplikacijskog programa (APSR) kako bi odredile treba li grananje izvršiti.

Većina izloženih asemblerskih instrukcija (uključujući operacije premještanja) postavlja zastavice, ali postoje eksplicitne instrukcije usporedbe koje omogućuju testiranje vrijednosti.

Daljnji detalji o značenju uvjetnih zastavica pruženi su u odjeljku instrukcije usporedbe.

7.1. Konvencije dokumenta

Notacija: Rm označava ARM registre R0-R15. LABEL označava oznaku definiranu asemblerskom direktivom label(). <condition> označava jedan od sljedećih specifikatora uvjeta:

  • eq Jednako (rezultat je bio nula)

  • ne Nije jednako

  • cs Prijenos postavljen

  • cc Prijenos očišćen

  • mi Minus (negativno)

  • pl Plus (pozitivno)

  • vs Preljev postavljen

  • vc Preljev očišćen

  • hi > (nepredznačena usporedba)

  • ls <= (nepredznačena usporedba)

  • ge >= (predznačena usporedba)

  • lt < (predznačena usporedba)

  • gt > (predznačena usporedba)

  • le <= (predznačena usporedba)

7.2. Grananje na oznaku

  • b(LABEL) Bezuvjetno grananje

  • beq(LABEL) grananje ako je jednako

  • bne(LABEL) grananje ako nije jednako

  • bge(LABEL) grananje ako je veće ili jednako

  • bgt(LABEL) grananje ako je veće

  • blt(LABEL) grananje ako je manje (<) (predznačeno)

  • ble(LABEL) grananje ako je manje ili jednako (<=) (predznačeno)

  • bcs(LABEL) grananje ako je zastavica prijenosa postavljena

  • bcc(LABEL) grananje ako je zastavica prijenosa očišćena

  • bmi(LABEL) grananje ako je negativno

  • bpl(LABEL) grananje ako je pozitivno

  • bvs(LABEL) grananje ako je zastavica preljeva postavljena

  • bvc(LABEL) grananje ako je zastavica preljeva očišćena

  • bhi(LABEL) grananje ako je više (nepredznačeno)

  • bls(LABEL) grananje ako je niže ili jednako (nepredznačeno)

7.3. Duga grananja

Kod proizveden gore navedenim instrukcijama grananja koristi fiksnu bitnu širinu za specificiranje odredišta grananja, koje je relativno u odnosu na PC. Posljedično, u dugim programima gdje je instrukcija grananja udaljena od svog odredišta, asembler će proizvesti pogrešku „branch not in range”. To se može prevladati „širokim” varijantama kao što je

  • beq_w(LABEL) dugo grananje ako je jednako

Široka grananja koriste 4 bajta za kodiranje instrukcije (u usporedbi s 2 bajta za standardne instrukcije grananja).

7.4. Potprogrami (funkcije)

Pri ulasku u potprogram procesor pohranjuje povratnu adresu u registar r14, poznat i kao poveznički registar (lr). Povratak na instrukciju nakon poziva potprograma izvodi se ažuriranjem programskog brojača (r15 ili pc) iz povezničkog registra. Ovaj proces obrađuju sljedeće instrukcije.

  • bl(LABEL)

Prenosi izvođenje na instrukciju nakon LABEL pohranjujući povratnu adresu u poveznički registar (r14).

  • bx(Rm) Grananje na adresu specificiranu s Rm.

Tipično se bx(lr) izdaje za povratak iz potprograma. Za ugniježđene potprograme poveznički registar vanjskih opsega mora se spremiti (obično na stog) prije izvođenja poziva unutarnjih potprograma.