7. Elágazó utasítások#
Ezek hatására a végrehajtás egy célhelyre ugrik, amelyet általában egy címke ad meg (lásd a label() assembler direktívát). A feltételes elágazások, valamint az it és ite utasítások az Application Program Status Register (APSR) N (negatív), Z (nulla), C (átvitel) és V (túlcsordulás) jelzőit vizsgálják annak eldöntésére, hogy az elágazást végre kell-e hajtani.
A legtöbb közzétett assembler utasítás (beleértve a move műveleteket is) beállítja a jelzőket, de léteznek explicit összehasonlító utasítások is, amelyek lehetővé teszik az értékek vizsgálatát.
A feltételjelzők jelentéséről további részletek az összehasonlító utasítások szakaszban találhatók.
7.1. Dokumentumkonvenciók#
Jelölés: az Rm az R0-R15 ARM regisztereket jelöli. A LABEL a label() assembler direktívával definiált címkét jelöli. A <condition> az alábbi feltételmegadók egyikét jelzi:
eq Egyenlő (az eredmény nulla volt)
ne Nem egyenlő
cs Átvitel beállítva
cc Átvitel törölve
mi Mínusz (negatív)
pl Plusz (pozitív)
vs Túlcsordulás beállítva
vc Túlcsordulás törölve
hi > (előjel nélküli összehasonlítás)
ls <= (előjel nélküli összehasonlítás)
ge >= (előjeles összehasonlítás)
lt < (előjeles összehasonlítás)
gt > (előjeles összehasonlítás)
le <= (előjeles összehasonlítás)
7.2. Elágazás címkére#
b(LABEL) Feltétel nélküli elágazás
beq(LABEL) elágazás, ha egyenlő
bne(LABEL) elágazás, ha nem egyenlő
bge(LABEL) elágazás, ha nagyobb vagy egyenlő
bgt(LABEL) elágazás, ha nagyobb
blt(LABEL) elágazás, ha kisebb (<) (előjeles)
ble(LABEL) elágazás, ha kisebb vagy egyenlő (<=) (előjeles)
bcs(LABEL) elágazás, ha az átvitel jelző beállított
bcc(LABEL) elágazás, ha az átvitel jelző törölt
bmi(LABEL) elágazás, ha negatív
bpl(LABEL) elágazás, ha pozitív
bvs(LABEL) elágazás, ha a túlcsordulás jelző beállított
bvc(LABEL) elágazás, ha a túlcsordulás jelző törölt
bhi(LABEL) elágazás, ha nagyobb (előjel nélküli)
bls(LABEL) elágazás, ha kisebb vagy egyenlő (előjel nélküli)
7.3. Hosszú elágazások#
A fentebb felsorolt elágazó utasítások által előállított kód rögzített bitszélességet használ az elágazás céljának megadásához, amely PC-relatív. Következésképpen hosszú programokban, ahol az elágazó utasítás távol van a céljától, az assembler „branch not in range” hibát fog adni. Ez a „wide” változatokkal küzdhető le, mint például
beq_w(LABEL) hosszú elágazás, ha egyenlő
A wide elágazások 4 bájtot használnak az utasítás kódolásához (szemben a szabványos elágazó utasítások 2 bájtjával).
7.4. Alprogramok (függvények)#
Egy alprogramba való belépéskor a processzor a visszatérési címet az r14 regiszterben tárolja, amely link regiszterként (lr) is ismert. Az alprogram-hívást követő utasításra való visszatérés a programszámláló (r15 vagy pc) link regiszterből való frissítésével történik. Ezt a folyamatot a következő utasítások kezelik.
bl(LABEL)
A végrehajtás átadása a LABEL utáni utasításra, a visszatérési cím tárolásával a link regiszterben (r14).
bx(Rm) Elágazás az Rm által megadott címre.
Egy alprogramból való visszatéréshez jellemzően a bx(lr) utasítást adjuk ki. Beágyazott alprogramok esetén a külső hatókörök link regiszterét el kell menteni (általában a verembe) a belső alprogram-hívások végrehajtása előtt.