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.