7. Haarautumiskäskyt

Nämä saavat suorituksen hyppäämään kohdesijaintiin, joka tavallisesti määritellään nimiöllä (katso label() -assembler-direktiivi). Ehdolliset haarautumiset sekä it- ja ite-käskyt testaavat Application Program Status Registerin (APSR) N (negatiivinen), Z (nolla), C (muistinumero) ja V (ylivuoto) -liput sen määrittämiseksi, tuleeko haarautuminen suorittaa.

Useimmat paljastetut assembler-käskyt (mukaan lukien siirto-operaatiot) asettavat liput, mutta arvojen testaamiseen on olemassa nimenomaisia vertailukäskyjä.

Lisätietoja ehtolippujen merkityksestä on osiossa vertailukäskyt.

7.1. Dokumentin merkintätavat

Merkintä: Rm tarkoittaa ARM-rekistereitä R0-R15. LABEL tarkoittaa nimiötä, joka on määritelty label() -assembler-direktiivillä. <condition> ilmaisee jonkin seuraavista ehtomäärittelijöistä:

  • eq Yhtä suuri kuin (tulos oli nolla)

  • ne Ei yhtä suuri

  • cs Muistinumero asetettu

  • cc Muistinumero tyhjennetty

  • mi Miinus (negatiivinen)

  • pl Plus (positiivinen)

  • vs Ylivuoto asetettu

  • vc Ylivuoto tyhjennetty

  • hi > (etumerkitön vertailu)

  • ls <= (etumerkitön vertailu)

  • ge >= (etumerkillinen vertailu)

  • lt < (etumerkillinen vertailu)

  • gt > (etumerkillinen vertailu)

  • le <= (etumerkillinen vertailu)

7.2. Haarautuminen nimiöön

  • b(LABEL) Ehdoton haarautuminen

  • beq(LABEL) haarautuu, jos yhtä suuri

  • bne(LABEL) haarautuu, jos ei yhtä suuri

  • bge(LABEL) haarautuu, jos suurempi tai yhtä suuri

  • bgt(LABEL) haarautuu, jos suurempi kuin

  • blt(LABEL) haarautuu, jos pienempi kuin (<) (etumerkillinen)

  • ble(LABEL) haarautuu, jos pienempi tai yhtä suuri kuin (<=) (etumerkillinen)

  • bcs(LABEL) haarautuu, jos muistinumeroliput on asetettu

  • bcc(LABEL) haarautuu, jos muistinumerolippu on tyhjennetty

  • bmi(LABEL) haarautuu, jos negatiivinen

  • bpl(LABEL) haarautuu, jos positiivinen

  • bvs(LABEL) haarautuu, jos ylivuotolippu on asetettu

  • bvc(LABEL) haarautuu, jos ylivuotolippu on tyhjennetty

  • bhi(LABEL) haarautuu, jos suurempi (etumerkitön)

  • bls(LABEL) haarautuu, jos pienempi tai yhtä suuri (etumerkitön)

7.3. Pitkät haarautumiset

Edellä lueteltujen haarautumiskäskyjen tuottama koodi käyttää kiinteää bittileveyttä haarautumiskohteen määrittämiseen, joka on PC-suhteellinen. Tämän vuoksi pitkissä ohjelmissa, joissa haarautumiskäsky on kaukana kohteestaan, assembler tuottaa virheen ”branch not in range”. Tämä voidaan kiertää käyttämällä ”wide”-muunnoksia, kuten

  • beq_w(LABEL) pitkä haarautuminen, jos yhtä suuri

Leveät haarautumiset käyttävät 4 tavua käskyn koodaamiseen (verrattuna vakiomuotoisten haarautumiskäskyjen 2 tavuun).

7.4. Aliohjelmat (funktiot)

Aliohjelmaan siirryttäessä prosessori tallentaa paluuosoitteen rekisteriin r14, joka tunnetaan myös linkkirekisterinä (lr). Paluu aliohjelmakutsua seuraavaan käskyyn tehdään päivittämällä ohjelmalaskuri (r15 tai pc) linkkirekisteristä. Tämän prosessin hoitavat seuraavat käskyt.

  • bl(LABEL)

Siirtää suorituksen käskyyn LABEL jälkeen ja tallentaa paluuosoitteen linkkirekisteriin (r14).

  • bx(Rm) Haarautuu rekisterin Rm määrittämään osoitteeseen.

Tyypillisesti bx(lr) annetaan aliohjelmasta palaamiseksi. Sisäkkäisissä aliohjelmissa ulompien näkyvyysalueiden linkkirekisteri on tallennettava (yleensä pinoon) ennen sisempien aliohjelmakutsujen suorittamista.