CBNZ |
Branchement et branchement si pas zéro |
| ARM |
Syntaxe
Paramètres
| Nom |
Description |
| Rn |
Ce paramètre permet d'indiquer le registre contenant l'opérande. |
| label |
Ce paramètre permet d'indiquer la destination de l'adresse de branchement. |
Description
Cette instruction permet d'effectuer une comparaison et branchement si ne vaut pas zéro.
Remarques
- Utilité de l'instruction CBNZ : L'instruction CBNZ est utilisée pour effectuer un branchement conditionnel uniquement si le contenu d'un registre
est différent de zéro. Cela permet de simplifier les tests conditionnels fréquents, notamment dans les boucles ou les structures de contrôle de flux comme les
"if" ou "while". Elle évite l'utilisation combinée d'une instruction de comparaison et d'un branchement, ce qui allège le code.
- Optimisation du code ARM : CBNZ contribue à l'optimisation du code en réduisant le nombre d'instructions nécessaires pour effectuer un test
conditionnel. Plutôt que d'utiliser un CMP suivi d'un BNE, l'instruction CBNZ combine les deux en une seule, ce qui permet de gagner en performance et en lisibilité.
Cela rend le code plus compact, ce qui est essentiel dans des environnements embarqués à ressources limitées.
- Condition implicite basée sur la valeur du registre : Contrairement à d'autres instructions conditionnelles s'appuyant sur des drapeaux de condition,
CBNZ effectue le test directement sur la valeur du registre. Cela signifie qu'elle ne dépend pas du résultat d'une opération précédente. Elle effectue une
comparaison implicite à zéro, ce qui rend son comportement indépendant des états du processeur.
- Syntaxe simple mais puissante : La syntaxe de CBNZ est concise : CBNZ Rn, label, où Rn est le registre à tester et label est la destination
en cas de succès. Cette simplicité cache une grande puissance, car elle permet de gérer des structures de contrôle comme des boucles ou des vérifications d'état de
manière très intuitive. Cela la rend facile à intégrer dans un programme même pour un débutant en assembleur ARM.
- Utilisation typique dans les boucles décrémentées : Une des utilisations les plus courantes de CBNZ est dans les boucles décrémentées, où un compteur
est entreposé dans un registre. À chaque itération, le compteur est décrémenté, et tant qu'il est non nul, le programme revient au début de la boucle. Cela rend
CBNZ très utile pour gérer les itérations sans surcharger la pile avec des appels ou des conditions complexes.
- Limitations de portée de l'étiquette : Le label utilisé dans l'instruction doit référencer une adresse atteignable par un saut relatif. Cela
signifie que la distance entre l'instruction CBNZ et la destination ne doit pas dépasser la portée que le processeur peut coder dans l'opcode. Cela limite parfois
l'utilisation directe de CBNZ dans des sauts très éloignés, nécessitant alors des solutions alternatives.
- Pas de modification des drapeaux : CBNZ ne modifie pas les drapeaux du registre d'état du programme (CPSR), ce qui est un avantage dans certains
contextes. Cela permet de conserver les résultats de comparaisons ou d'opérations précédentes. Elle est donc non destructive du point de vue du contexte du
processeur, ce qui est utile pour une programmation fine et prévisible.
- Compatibilité avec les architectures ARM modernes : CBNZ est disponible dans les architectures ARMv7 et ARMv8, ce qui la rend compatible avec de
nombreux systèmes embarqués modernes. Elle est aussi souvent supportée par les outils de développement comme l'assembleur GNU ARM ou ARM Keil. Elle
participe à la tendance des instructions spécialisées conçues pour des performances maximales et un code plus lisible.
Dernière mise à jour : Dimanche, le 12 novembre 2017