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.