Syntaxe
Paramètres
Nom |
Description |
cond |
Ce paramètre optionnel permet d'indiquer le code de condition |
Rn |
Ce paramètre permet d'indiquer le registre ARM contenant le premier opérande. |
Operand2 |
Ce paramètre permet d'indiquer le deuxième opérande flexible. |
Description
Cette instruction permet d'effectuer la comparaison d'opérande.
Remarques
- Instruction utilisée pour les comparaisons sans stockage de résultat : CMP permet de comparer deux valeurs sans enregistrer explicitement le résultat. Elle
effectue une soustraction logique entre Rn et Operand2, mais n'enregistre pas le résultat : seuls les drapeaux du registre d'état (NZCV) sont mis à jour. Elle est donc
utilisée exclusivement à des fins de prise de décision.
- Agit directement sur les drapeaux du processeur (CPSR) : CMP modifie les bits d'état (Négatif, Zéro, Retenue, Débordement) dans le registre CPSR. Ces
drapeaux permettent ensuite d'exécuter des instructions conditionnelles (comme BEQ, BNE, MOVGE,...) en fonction du résultat de la comparaison. Elle joue donc un rôle
central dans les structures de contrôle.
- Équivalente à une instruction SUB sans destination : Sur le plan fonctionnel, CMP est équivalente à une instruction SUB (soustraction) dont le résultat
n'est pas entreposé. Par exemple, CMP R1, R2 revient à faire SUBS R1, R1, R2 mais sans affecter R1. Cela permet de garder les données intactes tout en testant leur
relation.
- Operand2 est un opérande flexible très puissant : Le paramètre Operand2 peut être un registre, une constante immédiate, ou même un registre
décalé (shifted register). Cela donne à CMP une grande souplesse pour tester toutes sortes de valeurs sans avoir besoin de les préparer au préalable avec d'autres
instructions.
- Peut être utilisée de manière conditionnelle : Comme la plupart des instructions ARM, CMP accepte un champ {cond} permettant de conditionner son
exécution. Par exemple, CMPNE R0, #1 ne sera exécutée que si le résultat précédent était différent de zéro, évitant ainsi des comparaisons inutiles.
- Ne modifie aucun registre général : CMP ne modifie aucun des registres généraux (comme Rn ou d'autres). C'est ce qui la distingue d'une
instruction arithmétique classique. Cela garantit que les données originales sont préservées, ce qui est essentiel dans les séquences logiques où les données doivent
rester constantes.
- Instruction essentielle pour le contrôle de flux : CMP est indispensable pour la mise en ouvre de structures de contrôle comme les boucles (BNE, BEQ,...),
les tests conditionnels (if, switch), et même les appels de fonction conditionnels. Elle sert de base à la logique décisionnelle dans l'assembleur ARM.
- Peut introduire des erreurs si mal utilisée avec Operand2 : L'opérande Operand2 étant très flexible, il est facile de commettre des erreurs si l'on
utilise un décalage involontaire (par exemple, LSL non voulu). Il faut donc faire attention aux effets des décalages implicites ou aux constantes qui dépassent les
limites autorisées pour une immédiate.
Dernière mise à jour : Dimanche, le 12 novembre 2017