6. Porovnávací instrukce

Tyto provedou aritmetickou nebo logickou instrukci na dvou argumentech, zahodí výsledek, ale nastaví příznaky stavu. Typicky se používají k testování datových hodnot bez jejich změny před provedením podmíněného větvení.

6.1. Konvence dokumentu

Notace: Rd, Rm, Rn označují registry ARM R0-R7. imm8 označuje bezprostřední hodnotu o šířce 8 bitů.

6.2. Application Program Status Register (APSR)

Ten obsahuje čtyři bity, které jsou testovány instrukcemi podmíněného větvení. Typicky podmíněné větvení testuje více bitů, například bge(LABEL). Význam podmínkových kódů může záviset na tom, zda jsou operandy aritmetické instrukce pohlíženy jako znaménková nebo bezznaménková celá čísla. Tak bhi(LABEL) předpokládá, že byla zpracována bezznaménková čísla, zatímco bgt(LABEL) předpokládá znaménkové operandy.

6.3. Bity APSR

  • Z (nula)

Nastaví se, pokud je výsledek operace nula nebo pokud jsou operandy porovnání shodné.

  • N (záporný)

Nastaví se, pokud je výsledek záporný.

  • C (přenos)

Sčítání nastaví příznak přenosu, když výsledek přeteče z nejvýznamnějšího bitu (MSB), například při sčítání 0x80000000 a 0x80000000. Z povahy aritmetiky v doplňkovém kódu je toto chování při odčítání obrácené, kdy je výpůjčka indikována vynulovaným bitem přenosu. Tak 0x10 - 0x01 se provede jako 0x10 + 0xffffffff, což nastaví bit přenosu.

  • V (přetečení)

Příznak přetečení se nastaví, pokud má výsledek, pohlížený jako číslo v doplňkovém kódu, „špatné“ znaménko ve vztahu k operandům. Například přičtení 1 k 0x7fffffff nastaví bit přetečení, protože výsledek (0x80000000), pohlížený jako celé číslo v doplňkovém kódu, je záporný. Všimněte si, že v tomto případě není bit přenosu nastaven.

6.4. Porovnávací instrukce

Tyto nastaví příznaky N (záporný), Z (nula), C (přenos) a V (přetečení) registru APSR (Application Program Status Register).

  • cmp(Rn, imm8) Rn - imm8

  • cmp(Rn, Rm) Rn - Rm

  • cmn(Rn, Rm) Rn + Rm

  • tst(Rn, Rm) Rn & Rm

6.5. Podmíněné provádění

Instrukce it a ite poskytují prostředek pro podmíněné provedení jedné až čtyř následujících instrukcí bez potřeby návěští.

  • it(<podmínka>) If then

Provede následující instrukci, pokud je <podmínka> pravdivá:

cmp(r0, r1)
it(eq)
mov(r0, 100) # runs if r0 == r1
# execution continues here
  • ite(<podmínka>) If then else

Pokud je <podmínka> pravdivá, provede následující instrukci, jinak provede tu další. Tedy:

cmp(r0, r1)
ite(eq)
mov(r0, 100) # runs if r0 == r1
mov(r0, 200) # runs if r0 != r1
# execution continues here

Toto lze rozšířit na řízení provádění až čtyř následujících instrukcí: it[x[y[z]]], kde x,y,z=t/e; např. itt, itee, itete, ittte, itttt, iteee atd.