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.