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.