6. Összehasonlító utasítások

Ezek egy aritmetikai vagy logikai utasítást hajtanak végre két argumentumon, az eredményt eldobva, de a feltételjelzőket beállítva. Jellemzően arra használják őket, hogy adatértékeket teszteljenek anélkül, hogy megváltoztatnák azokat egy feltételes elágazás végrehajtása előtt.

6.1. Dokumentumkonvenciók

Jelölés: Rd, Rm, Rn az R0-R7 ARM-regisztereket jelöli. Az imm8 egy 8 bit szélességű azonnali értéket jelöl.

6.2. Az alkalmazásprogram-állapotregiszter (APSR)

Ez négy bitet tartalmaz, amelyeket a feltételes elágazási utasítások tesztelnek. Egy feltételes elágazás jellemzően több bitet tesztel, például bge(LABEL). A feltételkódok jelentése attól függhet, hogy egy aritmetikai utasítás operandusait előjeles vagy előjel nélküli egészként tekintjük-e. Így a bhi(LABEL) feltételezi, hogy előjel nélküli számokat dolgoztunk fel, míg a bgt(LABEL) előjeles operandusokat feltételez.

6.3. APSR-bitek

  • Z (zéró)

Akkor van beállítva, ha egy művelet eredménye nulla, vagy egy összehasonlítás operandusai egyenlők.

  • N (negatív)

Akkor van beállítva, ha az eredmény negatív.

  • C (átvitel)

Egy összeadás beállítja az átviteli jelzőt, amikor az eredmény túlcsordul az MSB-ből, például 0x80000000 és 0x80000000 összeadásakor. A kettes komplemensű aritmetika természetéből adódóan ez a viselkedés kivonásnál megfordul: a kölcsönt az átviteli bit törölt állapota jelzi. Így a 0x10 - 0x01 művelet 0x10 + 0xffffffff alakban hajtódik végre, ami beállítja az átviteli bitet.

  • V (túlcsordulás)

A túlcsordulási jelző akkor van beállítva, ha az eredménynek, kettes komplemensű számként tekintve, „rossz” az előjele az operandusokhoz képest. Például 1 hozzáadása a 0x7fffffff értékhez beállítja a túlcsordulási bitet, mert az eredmény (0x80000000), kettes komplemensű egészként tekintve, negatív. Vedd figyelembe, hogy ebben az esetben az átviteli bit nincs beállítva.

6.4. Összehasonlító utasítások

Ezek beállítják az APSR (alkalmazásprogram-állapotregiszter) N (negatív), Z (zéró), C (átvitel) és V (túlcsordulás) jelzőit.

  • cmp(Rn, imm8) Rn - imm8

  • cmp(Rn, Rm) Rn - Rm

  • cmn(Rn, Rm) Rn + Rm

  • tst(Rn, Rm) Rn & Rm

6.5. Feltételes végrehajtás

Az it és ite utasítások lehetőséget biztosítanak egytől négyig terjedő számú későbbi utasítás feltételes végrehajtására címke használata nélkül.

  • it(<condition>) If then (ha akkor)

Hajtsd végre a következő utasítást, ha a <condition> igaz:

cmp(r0, r1)
it(eq)
mov(r0, 100) # runs if r0 == r1
# execution continues here
  • ite(<condition>) If then else (ha akkor különben)

Ha a <condition> igaz, hajtsd végre a következő utasítást, egyébként hajtsd végre az azt követőt. Tehát:

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

Ez kiterjeszthető legfeljebb négy későbbi utasítás végrehajtásának vezérlésére: it[x[y[z]]], ahol x,y,z=t/e; pl. itt, itee, itete, ittte, itttt, iteee, stb.