CMN |
Comparaison négative |
| ARM |
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 négative d'opérande.
Remarques
- CMN est l'opposé logique de CMP : L'instruction CMN effectue en réalité une addition entre Rn et Operand2, mais à des fins de comparaison. Elle met à jour
les drapeaux de condition (N, Z, C, V) sans stocker le résultat. On peut la voir comme une CMP avec l'opérande 2 négatif, d'où son nom Compare Negative.
- Utile pour tester des additions sans modifier les registres : CMN permet de tester si la somme de deux valeurs dépasse une certaine limite ou provoque
un dépassement de capacité (overflow), tout en gardant intactes les valeurs dans les registres. C'est particulièrement utile dans les contrôles d'erreur ou de
débordement en arithmétique.
- Modifie les drapeaux du registre CPSR : Comme CMP, CMN met à jour les bits de statut dans le registre CPSR, notamment la retenue (C) et le débordement (V).
Cela permet d'utiliser ces drapeaux dans des instructions conditionnelles par la suite, comme BVS (branch if overflow set) ou BCC (branch if carry clear).
- Ne modifie pas les registres de données : CMN ne modifie ni Rn ni Operand2, ni aucun autre registre de données. Elle est purement utilisée à des fins
de comparaison, ce qui permet de l'utiliser en toute sécurité sans affecter les calculs en cours.
- Peut être utilisée dans une logique conditionnelle inversée : En faisant une addition au lieu d'une soustraction, CMN peut être utilisée pour simplifier
certaines expressions logiques. Par exemple, au lieu de faire CMP R1, #-5, on peut faire CMN R1, #5 - ce qui évite l'utilisation d'un immédiat négatif, parfois non
encodable directement.
- Supporte les opérandes flexibles grâce à Operand2 : Comme CMP, CMN bénéficie de l'extrême souplesse de l'opérande 2 dans ARM : on peut utiliser
un registre, une valeur immédiate ou un registre avec décalage. Cela permet de réaliser des comparaisons très précises avec un minimum d'instructions.
- Prend en charge l'exécution conditionnelle via {cond} : CMN peut être exécutée uniquement sous certaines conditions, grâce au champ {cond}. Cela permet
de l'insérer dans des séquences optimisées où seules certaines conditions logiques doivent être testées, sans branchements explicites.
- Instruction peu connue mais très utile pour les optimisations : CMN est souvent sous-utilisée car elle est moins intuitive que CMP, mais elle peut être
cruciale dans certains cas où une addition logique est plus appropriée qu'une soustraction. Elle permet également de coder plus efficacement certaines opérations sur des
constantes non représentables sous forme négative.
Dernière mise à jour : Dimanche, le 12 novembre 2017