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.