6. Vertailukäskyt¶
Nämä suorittavat aritmeettisen tai loogisen käskyn kahdelle argumentille, hylkäävät tuloksen mutta asettavat ehtoliput. Tyypillisesti niitä käytetään testaamaan data-arvoja muuttamatta niitä ennen ehdollisen haarautumisen suorittamista.
6.1. Dokumenttikäytännöt¶
Merkintätapa: Rd, Rm, Rn tarkoittavat ARM-rekistereitä R0-R7. imm8 tarkoittaa 8 bitin levyistä välitöntä arvoa.
6.2. Sovelluksen ohjelmatilarekisteri (APSR)¶
Tämä sisältää neljä bittiä, joita ehdolliset haarautumiskäskyt testaavat. Tyypillisesti ehdollinen haarautuminen testaa useita bittejä, esimerkiksi bge(LABEL). Ehtokoodien merkitys voi riippua siitä, tulkitaanko aritmeettisen käskyn operandit etumerkillisiksi vai etumerkittömiksi kokonaisluvuiksi. Niinpä bhi(LABEL) olettaa käsiteltyjen lukujen olevan etumerkittömiä, kun taas bgt(LABEL) olettaa operandien olevan etumerkillisiä.
6.3. APSR-bitit¶
Z (nolla)
Tämä asetetaan, jos operaation tulos on nolla tai vertailun operandit ovat yhtä suuret.
N (negatiivinen)
Asetetaan, jos tulos on negatiivinen.
C (carry)
Yhteenlasku asettaa carry-lipun, kun tulos vuotaa yli MSB:stä, esimerkiksi laskettaessa yhteen 0x80000000 ja 0x80000000. Kahden komplementin aritmetiikan luonteen vuoksi tämä toiminta kääntyy päinvastaiseksi vähennyslaskussa, jolloin lainausta osoittaa carry-bitin nollautuminen. Niinpä 0x10 - 0x01 suoritetaan muodossa 0x10 + 0xffffffff, joka asettaa carry-bitin.
V (ylivuoto)
Ylivuotolippu asetetaan, jos tuloksella, kahden komplementin lukuna tulkittuna, on ”väärä” etumerkki operandeihin nähden. Esimerkiksi yhden lisääminen arvoon 0x7fffffff asettaa ylivuotobitin, koska tulos (0x80000000) on kahden komplementin kokonaislukuna tulkittuna negatiivinen. Huomaa, että tässä tapauksessa carry-bittiä ei aseteta.
6.4. Vertailukäskyt¶
Nämä asettavat APSR:n (Application Program Status Register) N (negatiivinen)-, Z (nolla)-, C (carry)- ja V (ylivuoto) -liput.
cmp(Rn, imm8)
Rn - imm8cmp(Rn, Rm)
Rn - Rmcmn(Rn, Rm)
Rn + Rmtst(Rn, Rm)
Rn & Rm
6.5. Ehdollinen suoritus¶
Käskyt it ja ite tarjoavat keinon suorittaa ehdollisesti yhdestä neljään seuraavaa käskyä ilman tarvetta nimiölle.
it(<condition>) If then
Suorita seuraava käsky, jos <condition> on tosi:
cmp(r0, r1)
it(eq)
mov(r0, 100) # runs if r0 == r1
# execution continues here
ite(<condition>) If then else
Jos <condition> on tosi, suorita seuraava käsky, muuten suorita sitä seuraava. Niinpä:
cmp(r0, r1)
ite(eq)
mov(r0, 100) # runs if r0 == r1
mov(r0, 200) # runs if r0 != r1
# execution continues here
Tätä voidaan laajentaa ohjaamaan jopa neljän seuraavan käskyn suoritusta: it[x[y[z]]] missä x,y,z=t/e; esim. itt, itee, itete, ittte, itttt, iteee jne.