6. Instructions de comparaison

Celles-ci effectuent une instruction arithmétique ou logique sur deux arguments, en abandonnant le résultat mais en positionnant les indicateurs de condition. Elles servent généralement à tester des valeurs de données sans les modifier avant l’exécution d’un branchement conditionnel.

6.1. Conventions du document

Notation : Rd, Rm, Rn désignent les registres ARM R0-R7. imm8 désigne une valeur immédiate d’une largeur de 8 bits.

6.2. Le registre d’état du programme d’application (APSR)

Il contient quatre bits qui sont testés par les instructions de branchement conditionnel. Généralement, un branchement conditionnel teste plusieurs bits, par exemple bge(LABEL). La signification des codes de condition peut dépendre du fait que les opérandes d’une instruction arithmétique soient considérés comme des entiers signés ou non signés. Ainsi bhi(LABEL) suppose que des nombres non signés ont été traités, tandis que bgt(LABEL) suppose des opérandes signés.

6.3. Bits de l’APSR

  • Z (zéro)

Il est positionné si le résultat d’une opération est nul ou si les opérandes d’une comparaison sont égaux.

  • N (négatif)

Positionné si le résultat est négatif.

  • C (retenue)

Une addition positionne l’indicateur de retenue lorsque le résultat déborde au-delà du MSB, par exemple en additionnant 0x80000000 et 0x80000000. De par la nature de l’arithmétique en complément à deux, ce comportement est inversé lors d’une soustraction, un emprunt étant indiqué par le bit de retenue à zéro. Ainsi 0x10 - 0x01 est exécuté comme 0x10 + 0xffffffff, ce qui positionnera le bit de retenue.

  • V (dépassement)

L’indicateur de dépassement est positionné si le résultat, considéré comme un nombre en complément à deux, a le « mauvais » signe par rapport aux opérandes. Par exemple, ajouter 1 à 0x7fffffff positionnera le bit de dépassement car le résultat (0x80000000), considéré comme un entier en complément à deux, est négatif. Notez que dans ce cas le bit de retenue n’est pas positionné.

6.4. Instructions de comparaison

Celles-ci positionnent les indicateurs N (négatif), Z (zéro), C (retenue) et V (dépassement) de l’APSR (Application Program Status Register).

  • cmp(Rn, imm8) Rn - imm8

  • cmp(Rn, Rm) Rn - Rm

  • cmn(Rn, Rm) Rn + Rm

  • tst(Rn, Rm) Rn & Rm

6.5. Exécution conditionnelle

Les instructions it et ite offrent un moyen d’exécuter conditionnellement d’une à quatre instructions subséquentes sans nécessiter d’étiquette.

  • it(<condition>) If then

Exécute l’instruction suivante si <condition> est vraie :

cmp(r0, r1)
it(eq)
mov(r0, 100) # runs if r0 == r1
# execution continues here
  • ite(<condition>) If then else

Si <condition> est vraie, exécute l’instruction suivante, sinon exécute celle d’après. Ainsi :

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

Cela peut être étendu pour contrôler l’exécution de jusqu’à quatre instructions subséquentes : it[x[y[z]]] où x,y,z=t/e ; par exemple itt, itee, itete, ittte, itttt, iteee, etc.