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.