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 - imm8

  • cmp(Rn, Rm) Rn - Rm

  • cmn(Rn, Rm) Rn + Rm

  • tst(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.