7. Greninstruktioner¶
Dessa får exekveringen att hoppa till en målplats som vanligtvis anges med en etikett (se assemblerdirektivet label()). Villkorliga grenar och instruktionerna it och ite testar flaggorna N (negativ), Z (noll), C (carry) och V (overflow) i Application Program Status Register (APSR) för att avgöra om grenen ska utföras.
De flesta av de exponerade assemblerinstruktionerna (inklusive flyttoperationer) sätter flaggorna, men det finns explicita jämförelseinstruktioner som möjliggör testning av värden.
Ytterligare detaljer om innebörden av villkorsflaggorna finns i avsnittet jämförelseinstruktioner.
7.1. Dokumentkonventioner¶
Notation: Rm betecknar ARM-registren R0-R15. LABEL betecknar en etikett som definierats med assemblerdirektivet label(). <condition> anger en av följande villkorsangivelser:
eq Lika med (resultatet var noll)
ne Inte lika med
cs Carry satt
cc Carry rensad
mi Minus (negativ)
pl Plus (positiv)
vs Overflow satt
vc Overflow rensad
hi > (osignerad jämförelse)
ls <= (osignerad jämförelse)
ge >= (signerad jämförelse)
lt < (signerad jämförelse)
gt > (signerad jämförelse)
le <= (signerad jämförelse)
7.2. Gren till etikett¶
b(LABEL) Ovillkorlig gren
beq(LABEL) gren om lika med
bne(LABEL) gren om inte lika med
bge(LABEL) gren om större än eller lika med
bgt(LABEL) gren om större än
blt(LABEL) gren om mindre än (<) (signerad)
ble(LABEL) gren om mindre än eller lika med (<=) (signerad)
bcs(LABEL) gren om carry-flaggan är satt
bcc(LABEL) gren om carry-flaggan är rensad
bmi(LABEL) gren om negativ
bpl(LABEL) gren om positiv
bvs(LABEL) gren om overflow-flaggan är satt
bvc(LABEL) gren om overflow-flaggan är rensad
bhi(LABEL) gren om högre (osignerad)
bls(LABEL) gren om lägre eller lika med (osignerad)
7.3. Långa grenar¶
Koden som produceras av de greninstruktioner som listas ovan använder en fast bitbredd för att ange grendestinationen, vilken är PC-relativ. Följaktligen kommer assemblern, i långa program där greninstruktionen är avlägsen från sin destination, att producera felet ”branch not in range”. Detta kan kringgås med de ”breda” varianterna såsom
beq_w(LABEL) lång gren om lika med
Breda grenar använder 4 byte för att koda instruktionen (jämfört med 2 byte för standardgreninstruktioner).
7.4. Subrutiner (funktioner)¶
När processorn går in i en subrutin lagrar den returadressen i register r14, även känt som länkregistret (lr). Återgång till instruktionen efter subrutinanropet utförs genom att uppdatera programräknaren (r15 eller pc) från länkregistret. Denna process hanteras av följande instruktioner.
bl(LABEL)
Överför exekveringen till instruktionen efter LABEL och lagrar returadressen i länkregistret (r14).
bx(Rm) Gren till adressen som anges av Rm.
Vanligtvis används bx(lr) för att återvända från en subrutin. För nästlade subrutiner måste de yttre omfångens länkregister sparas (vanligtvis på stacken) innan inre subrutinanrop utförs.