Větvení programu
Program obvykle není prováděn lineárně, instrukce po instrukci, ale podle vyhodnocení podmínek jsou prováděny různé větve programu. Umožňují to instrukce skoku.
Nepodmíněný skok
Základní instrukcí, která mění pořadí provádění instrukcí je nepodmíněný skok na návěští B (Branch) a skok na adresu obsaženou v registru BX (Branch indirect). Adresa obsažená v registru musí mít nejnižší bit nastavený na hodnotu 1, jinak dojde k pokusu o přepnutí do stavu ARM a tím k vygenerování chybové výjimky.
@ instrukce Branch B label_1 @ skok na label_1 ... label_1: MOV R1, R0 ... @ instrukce Branch indirect MOV R0, #0x101 @ nastav cílovou adresu BX R0 @ skok na adresu 0x100
Volání podprogramu
Pro volání podprogramu se používá instrukce BL (Branch with link), která nejdříve uloží adresu následující instrukce do registru LR a potom provede skok na návěští. Pro návrat z podprogramu není k dispozici žádná speciální instrukce, lze použít například instrukci BX s operandem LR.
Pokud v podprogramu voláme další podprogram nebo jinak měníme registr LR, musíme uložit obsah registru LR na zásobník a před návratem jej obnovit.
@ instrukce Branch with link BL subr_1 @ volání podprogramu subr_1 ... subr_1: PUSH {LR} @ uložení LR na zásobník ... BL subr_2 @ volání podprogramu subr_2 ... POP {PC} @ načtením LR ze zásobníku @ přímo do PC se provede @ návrat z podprogramu subr_2: ... @ tělo podprogramu BX LR @ návrat z podprogramu
Podprogram lze také volat instrukcí BLX (Branch indirect with link), která uloží návratovou adresu do registru LR a provede skok na adresu uloženou v registru, který je operandem instrukce. Aby nebyla generována chybová výjimka, musí mít adresa podprogramu, uložená v registru, nastavený nejnižší bit na jedničku.
Podmíněný skok
Většinou se větvení programu provádí na základě vyhodnocení podmínky. K tomu slouží přípony, které lze přidat k instrukcím skoku. Podmínka se vyhodnocuje podle obsahu příznaků N, Z, C a V, které jsou ve speciálním registru APSR. Přehled přípon a jejich významu shrnuje tabulka 1.1.
BEQ shoda @ pokud jsou stejné, skoč na shoda
Přípona | Příznaky | Význam |
EQ | Z = 1 | Equal |
NE | Z = 0 | Not equal |
CS nebo HS | C = 1 | Higher or same, unsigned |
CC nebo LO | C = 0 | Lower, unsigned |
MI | N = 1 | Minus or negative |
PL | N = 0 | Positive or zero |
VS | V = 1 | Overflow |
VC | V = 0 | No overflow |
HI | C = 1 and Z = 0 | Higher, unsigned |
LS | C = 0 or Z = 1 | Lower or same, unsigned |
GE | N = V | Greater than or equal, signed |
LT | N != V | Less than, signed |
GT | Z = 0 and N = V | Greater than, signed |
LE | Z = 1 and N != V | Less than or equal, signed |
AL | Always |
Nastavení příznaků v registru APSR je provedeno, pokud je u datové operace použita přípona S, například pro sčítání instrukcí ADDS. Pokud je použita 16-bitová Thumb instrukce, příznaky jsou aktualizovány automaticky. Příkladem může být test na zápornou hodnotu, po provedené operaci odčítání:
SUBS R0, R1, R2 @ R0 = R1 - R2 BMI minus @ pokud je R0 < 0 skoč na minus
Nastavení příznaků provádí také porovnávací a testovací instrukce CMP (Compare), CMN (Compare Negative) a TST (Test bits). Instrukce provedou operaci nad operandy, ale výsledek neukládají do žádného registru, pouze aktualizují příznaky N, Z, C a V.
- CMP odečte druhý operand od prvního
- CMN odečte zápornou hodnotu (dvojkový doplněk) druhého operandu od prvního
- TST provede logický součin mezi oběma operandy
CMP R0, R1 @ R0 - R1 CMN R0, R1 @ R0 - (-R1) TST R0, R1 @ R0 AND R1
Testování obsahu dvou registrů na shodu a relaci větší/menší pomocí instrukce CMP může být provedeno například takto.
CMP R1, R3 @ R1 - R3 BEQ shoda @ pokud jsou stejné, skoč na shoda BMI minus @ pokud je R1 < R3, skoč na minus ... @ zde je R1 > R3