6. Vergelijkingsinstructies¶
Deze voeren een rekenkundige of logische instructie uit op twee argumenten, waarbij het resultaat wordt weggegooid maar de conditievlaggen worden gezet. Doorgaans worden ze gebruikt om datawaarden te testen zonder ze te wijzigen, voorafgaand aan het uitvoeren van een voorwaardelijke vertakking.
6.1. Documentconventies¶
Notatie: Rd, Rm, Rn duiden ARM-registers R0-R7 aan. imm8 duidt een directe waarde aan met een breedte van 8 bits.
6.2. Het Application Program Status Register (APSR)¶
Dit bevat vier bits die door de voorwaardelijke-vertakkingsinstructies worden getest. Doorgaans test een voorwaardelijke vertakking meerdere bits, bijvoorbeeld bge(LABEL). De betekenis van conditiecodes kan afhangen van of de operanden van een rekenkundige instructie als signed of unsigned gehele getallen worden beschouwd. Zo gaat bhi(LABEL) ervan uit dat unsigned getallen zijn verwerkt, terwijl bgt(LABEL) signed operanden veronderstelt.
6.3. APSR-bits¶
Z (zero)
Dit wordt gezet als het resultaat van een bewerking nul is of de operanden van een vergelijking gelijk zijn.
N (negative)
Gezet als het resultaat negatief is.
C (carry)
Een optelling zet de carry-vlag wanneer het resultaat buiten de MSB overloopt, bijvoorbeeld bij het optellen van 0x80000000 en 0x80000000. Door de aard van two’s-complement-rekenkunde is dit gedrag omgekeerd bij aftrekking, waarbij een lening wordt aangegeven doordat de carry-bit nul is. Zo wordt 0x10 - 0x01 uitgevoerd als 0x10 + 0xffffffff, wat de carry-bit zal zetten.
V (overflow)
De overflow-vlag wordt gezet als het resultaat, beschouwd als een two’s-complement-getal, het “verkeerde” teken heeft ten opzichte van de operanden. Bijvoorbeeld het optellen van 1 bij 0x7fffffff zet de overflow-bit omdat het resultaat (0x80000000), beschouwd als een two’s-complement-geheel getal, negatief is. Merk op dat in dit geval de carry-bit niet wordt gezet.
6.4. Vergelijkingsinstructies¶
Deze zetten de APSR-vlaggen (Application Program Status Register) N (negative), Z (zero), C (carry) en V (overflow).
cmp(Rn, imm8)
Rn - imm8cmp(Rn, Rm)
Rn - Rmcmn(Rn, Rm)
Rn + Rmtst(Rn, Rm)
Rn & Rm
6.5. Voorwaardelijke uitvoering¶
De instructies it en ite bieden een manier om één tot vier daaropvolgende instructies voorwaardelijk uit te voeren zonder dat een label nodig is.
it(<condition>) If then
Voer de volgende instructie uit als <condition> waar is:
cmp(r0, r1)
it(eq)
mov(r0, 100) # runs if r0 == r1
# execution continues here
ite(<condition>) If then else
Als <condition> waar is, voer dan de volgende instructie uit, voer anders de daaropvolgende uit. Dus:
cmp(r0, r1)
ite(eq)
mov(r0, 100) # runs if r0 == r1
mov(r0, 200) # runs if r0 != r1
# execution continues here
Dit kan worden uitgebreid om de uitvoering van maximaal vier daaropvolgende instructies te besturen: it[x[y[z]]] waarbij x,y,z=t/e; bijv. itt, itee, itete, ittte, itttt, iteee, enz.