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 - imm8cmp(Rn, Rm)
Rn - Rmcmn(Rn, Rm)
Rn + Rmtst(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.