Produkty Novinky Články Návody Kontakty

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
Tabulka 1.1 Příznaky podmínky
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
​