7. Instrucțiuni de ramificare

Acestea fac ca execuția să sară către o locație țintă, specificată de obicei printr-o etichetă (vezi directiva de asamblor label()). Ramificările condiționate și instrucțiunile it și ite testează indicatorii N (negativ), Z (zero), C (transport) și V (depășire) din registrul Application Program Status Register (APSR) pentru a determina dacă ramificarea ar trebui executată.

Majoritatea instrucțiunilor de asamblor expuse (inclusiv operațiile de mutare) setează indicatorii, dar există instrucțiuni de comparare explicite care permit testarea valorilor.

Detalii suplimentare despre semnificația indicatorilor de condiție sunt furnizate în secțiunea instrucțiuni de comparare.

7.1. Convenții ale documentului

Notație: Rm denotă registrele ARM R0-R15. LABEL denotă o etichetă definită cu directiva de asamblor label(). <condition> indică unul dintre următorii specificatori de condiție:

  • eq Egal cu (rezultatul a fost zero)

  • ne Diferit

  • cs Transport setat

  • cc Transport șters

  • mi Minus (negativ)

  • pl Plus (pozitiv)

  • vs Depășire setată

  • vc Depășire ștearsă

  • hi > (comparație fără semn)

  • ls <= (comparație fără semn)

  • ge >= (comparație cu semn)

  • lt < (comparație cu semn)

  • gt > (comparație cu semn)

  • le <= (comparație cu semn)

7.2. Ramificare către etichetă

  • b(LABEL) Ramificare necondiționată

  • beq(LABEL) ramificare dacă este egal

  • bne(LABEL) ramificare dacă nu este egal

  • bge(LABEL) ramificare dacă este mai mare sau egal

  • bgt(LABEL) ramificare dacă este mai mare

  • blt(LABEL) ramificare dacă este mai mic (<) (cu semn)

  • ble(LABEL) ramificare dacă este mai mic sau egal (<=) (cu semn)

  • bcs(LABEL) ramificare dacă indicatorul de transport este setat

  • bcc(LABEL) ramificare dacă indicatorul de transport este șters

  • bmi(LABEL) ramificare dacă este negativ

  • bpl(LABEL) ramificare dacă este pozitiv

  • bvs(LABEL) ramificare dacă indicatorul de depășire este setat

  • bvc(LABEL) ramificare dacă indicatorul de depășire este șters

  • bhi(LABEL) ramificare dacă este mai mare (fără semn)

  • bls(LABEL) ramificare dacă este mai mic sau egal (fără semn)

7.3. Ramificări lungi

Codul produs de instrucțiunile de ramificare enumerate mai sus folosește o lățime de biți fixă pentru a specifica destinația ramificării, care este relativă la PC. În consecință, în programele lungi în care instrucțiunea de ramificare este îndepărtată de destinația sa, asamblorul va produce o eroare „branch not in range”. Acest lucru poate fi depășit cu variantele „wide”, precum

  • beq_w(LABEL) ramificare lungă dacă este egal

Ramificările wide folosesc 4 octeți pentru a codifica instrucțiunea (comparativ cu 2 octeți pentru instrucțiunile de ramificare standard).

7.4. Subrutine (funcții)

La intrarea într-o subrutină, procesorul stochează adresa de retur în registrul r14, cunoscut și ca registrul de legătură (lr). Revenirea la instrucțiunea de după apelul subrutinei se realizează prin actualizarea contorului de program (r15 sau pc) din registrul de legătură. Acest proces este gestionat de următoarele instrucțiuni.

  • bl(LABEL)

Transferă execuția către instrucțiunea de după LABEL, stocând adresa de retur în registrul de legătură (r14).

  • bx(Rm) Ramificare către adresa specificată de Rm.

De obicei se folosește bx(lr) pentru a reveni dintr-o subrutină. Pentru subrutine imbricate, registrul de legătură al domeniilor exterioare trebuie salvat (de obicei pe stivă) înainte de a efectua apeluri de subrutine interioare.