7. Instrukce větvení¶
Ty způsobí, že vykonávání skočí na cílové umístění, obvykle určené návěštím (viz assemblerová direktiva label()). Podmíněná větvení a instrukce it a ite testují příznaky N (záporný), Z (nula), C (přenos) a V (přetečení) registru Application Program Status Register (APSR), aby určily, zda by se větvení mělo provést.
Většina vystavených assemblerových instrukcí (včetně přesunových operací) nastavuje příznaky, ale existují explicitní porovnávací instrukce umožňující testování hodnot.
Další podrobnosti o významu příznaků podmínek jsou uvedeny v sekci porovnávací instrukce.
7.1. Konvence dokumentu¶
Notace: Rm označuje ARM registry R0-R15. LABEL označuje návěští definované assemblerovou direktivou label(). <condition> udává jeden z následujících specifikátorů podmínky:
eq Rovno (výsledek byl nula)
ne Není rovno
cs Přenos nastaven
cc Přenos vymazán
mi Mínus (záporný)
pl Plus (kladný)
vs Přetečení nastaveno
vc Přetečení vymazáno
hi > (porovnání bez znaménka)
ls <= (porovnání bez znaménka)
ge >= (porovnání se znaménkem)
lt < (porovnání se znaménkem)
gt > (porovnání se znaménkem)
le <= (porovnání se znaménkem)
7.2. Větvení na návěští¶
b(LABEL) Nepodmíněné větvení
beq(LABEL) větvení, pokud rovno
bne(LABEL) větvení, pokud není rovno
bge(LABEL) větvení, pokud větší nebo rovno
bgt(LABEL) větvení, pokud větší než
blt(LABEL) větvení, pokud menší než (<) (se znaménkem)
ble(LABEL) větvení, pokud menší nebo rovno (<=) (se znaménkem)
bcs(LABEL) větvení, pokud je nastaven příznak přenosu
bcc(LABEL) větvení, pokud je příznak přenosu vymazán
bmi(LABEL) větvení, pokud záporné
bpl(LABEL) větvení, pokud kladné
bvs(LABEL) větvení, pokud je nastaven příznak přetečení
bvc(LABEL) větvení, pokud je příznak přetečení vymazán
bhi(LABEL) větvení, pokud vyšší (bez znaménka)
bls(LABEL) větvení, pokud nižší nebo rovno (bez znaménka)
7.3. Dlouhá větvení¶
Kód produkovaný výše uvedenými instrukcemi větvení používá pevnou bitovou šířku k určení cíle větvení, který je relativní vůči PC. Následkem toho v dlouhých programech, kde je instrukce větvení vzdálená od svého cíle, assembler vyprodukuje chybu „branch not in range“. To lze překonat „wide“ variantami, jako například
beq_w(LABEL) dlouhé větvení, pokud rovno
Wide větvení používají k zakódování instrukce 4 bajty (oproti 2 bajtům u standardních instrukcí větvení).
7.4. Podprogramy (funkce)¶
Při vstupu do podprogramu procesor uloží návratovou adresu do registru r14, známého také jako link registr (lr). Návrat na instrukci za voláním podprogramu se provádí aktualizací program counteru (r15 nebo pc) z link registru. Tento proces zajišťují následující instrukce.
bl(LABEL)
Předá vykonávání instrukci za LABEL a uloží návratovou adresu do link registru (r14).
bx(Rm) Větvení na adresu určenou Rm.
Obvykle se k návratu z podprogramu použije bx(lr). U vnořených podprogramů musí být link registr vnějších rozsahů uložen (obvykle na zásobník) před prováděním vnitřních volání podprogramů.