BLX |
Branchement et échange |
|---|---|
| ARM | |
Syntaxe
|
BLX{cond}{.W} label BLX{cond} Rm |
Paramètres
| Nom | Description |
|---|---|
| cond | Ce paramètre optionnel permet d'indiquer le code de condition |
| .W | Ce paramètre optionnel permet d'indiquer la largeur de l'instruction |
| label | Ce paramètre permet d'indiquer expression relative à PC. |
| Rm | Ce paramètre permet d'indiquer un registre contenant l'adresse de branchement. |
Description
Cette instruction permet d'effectuer un saut et change le jeu d'instructions et indique la largeur de données.
Remarques
- Appel de fonction avec changement possible d'état d'instruction : BLX permet non seulement de faire un appel de sous-programme (comme BL), mais aussi de changer le mode d'exécution entre ARM (32 bits) et Thumb (16/32 bits). Cela est possible grâce au bit 0 de l'adresse cible : s'il est à 1, on passe en Thumb ; à 0, on reste en ARM. C'est un mécanisme fondamental pour l'interopérabilité entre modules compilés dans des modes différents.
- Deux formes de syntaxe selon le type de branchement : Il existe deux formes principales de BLX : une avec une étiquette relative (BLX label), et une avec une adresse contenue dans un registre (BLX Rm). La première est utile pour appeler des fonctions proches dans le code, la seconde pour des appels dynamiques, par exemple via des pointeurs de fonctions.
- Sauvegarde automatique de l'adresse de retour dans LR : Comme BL, l'instruction BLX place l'adresse de retour dans le registre LR (Link Register), ce qui permet un retour au point d'appel via BX LR. Cela rend BLX compatible avec les appels de fonctions structurés, même dans un environnement multi-mode (ARM/Thumb).
- Facilite l'interopérabilité entre bibliothèques ARM et Thumb : Dans de nombreux systèmes embarqués, certaines bibliothèques sont compilées en mode Thumb pour gagner de la place, tandis que d'autres modules restent en mode ARM pour la performance. BLX permet de sauter d'un mode à l'autre lors de l'appel de fonctions, ce qui permet une compatibilité entre tous les modules.
- Encodage spécifique selon le type de cible : Lorsqu'on utilise BLX avec un label, l'instruction est encodée différemment que lorsqu'on l'utilise avec un registre (Rm). Il faut faire attention aux restrictions du processeur cible (notamment dans les Cortex-M ou Cortex-A), car certaines formes peuvent ne pas être disponibles en fonction du mode ou du jeu d'instructions utilisé.
- Suffixe .W utile pour les sauts longs en Thumb : Le suffixe .W force un encodage 32 bits, particulièrement utile en mode Thumb, où les instructions 16 bits ont une portée limitée. L'utilisation de BLX.W permet donc d'accéder à des destinations plus éloignées, ce qui est important lorsqu'on travaille dans de grandes bases de code.
- Attention à la validité des adresses dans BLX Rm : Quand on utilise BLX avec un registre (BLX Rm), il est crucial que l'adresse dans Rm soit bien alignée (et le bit 0 correct selon le mode d'exécution voulu). Une mauvaise adresse pourrait entraîner une exception ou un comportement imprévu, surtout dans les processeurs avec vérification stricte de l'alignement.
- Essentielle dans la gestion de vecteurs d'interruption ou de pointeurs de fonctions : Dans les systèmes embarqués, BLX Rm est souvent utilisée pour appeler dynamiquement une fonction entreposée dans un tableau de pointeurs, comme les vecteurs d'interruption ou les callbacks. Cela permet une architecture modulaire, où les fonctions peuvent être remplacées dynamiquement en mémoire.
Dernière mise à jour : Dimanche, le 12 novembre 2017