LSL |
Décalage vers la gauche logique |
---|---|
ARM |
Syntaxe
LSL{S}{cond} Rd, Rm, Rs |
LSL{S}{cond} Rd, Rm, #sh |
Paramètres
Nom | Description |
---|---|
S | Ce paramètre optionnel permet d'indiquer le suffixe. Si ce paramètre est spécifié, les drapeaux de condition sont mise à jour dans le résultat de l'opérande |
cond | Ce paramètre optionnel permet d'indiquer le code de condition |
Rd | Ce paramètre permet d'indiquer le registre de destination |
Rm | Ce paramètre permet d'indiquer le registre contenant le premier opérande. L'opérande allant être décalé vers la gauche. |
Rs | Ce paramètre permet d'indiquer le registre contenant la valeur de décalage à appliquer à la valeur du paramètre Rm. |
sh | Ce paramètre permet d'indiquer une constante de décalage. La valeur doit être situé dans l'intervalle de 0 à 31. |
Description
Cette instruction permet d'effectuer le décalage de bits logique vers la gauche.
Remarques
- LSL est un synonyme privilégié de MOV avec décalage : L'instruction LSL est une alternative aux instructions MOV utilisant des registres avec décalage. Cela signifie qu'elle n'ajoute pas de nouvelles fonctionnalités au processeur, mais simplifie la lisibilité et la compréhension du code assembleur. Elle permet notamment d'exprimer plus clairement l'intention de multiplier un registre par une puissance de deux.
- Utilisation de la mise à jour des drapeaux avec le suffixe S : Lorsque le suffixe S est ajouté à l'instruction LSL, les drapeaux conditionnels du CPSR sont mis à jour. En particulier, les drapeaux N (négatif) et Z (zéro) sont modifiés en fonction du résultat, tandis que le drapeau C (carry) est mis à jour uniquement si la valeur du décalage est différente de zéro. Cela peut être utile pour la gestion des conditions dans le code.
- Le registre Rs utilise uniquement l'octet de poids faible : Lorsqu'un registre est utilisé pour spécifier la valeur du décalage (Rs), seul son octet de poids faible est pris en compte. Cela signifie que toute valeur supérieure à 255 dans Rs sera ignorée pour le calcul du décalage, ce qui peut potentiellement causer des résultats inattendus si la valeur de Rs n'est pas contrôlée correctement.
- Valeurs permises pour le décalage immédiat : Lorsque le décalage est spécifié comme une constante immédiate (#sh), il doit être compris entre 0 et 31. Cette limitation est importante car un décalage supérieur à 31 n'aurait pas de sens en raison de la largeur de 32 bits des registres. Une valeur de décalage de 0 peut être problématique dans certains contextes, notamment dans un IT block.
- Restrictions dans l'architecture T32 : Dans le jeu d'instructions T32 (Thumb-2), certaines restrictions s'appliquent à l'instruction LSL. Notamment, elle ne peut pas utiliser les registres PC (compteur de programme) ou SP (pointeur de pile), ce qui limite certaines optimisations possibles dans ce mode. De plus, dans un IT block, le décalage immédiat ne peut pas être de zéro.
- Dépréciation de l'utilisation de SP et PC en A32 : Bien que l'utilisation de SP soit tolérée dans certaines variantes de l'instruction en mode A32, elle est considérée comme obsolète. L'utilisation de PC est encore plus contraignante, car elle peut entraîner des comportements spécifiques, comme une branche d'exécution (si utilisé comme Rd) ou la prise en compte d'une adresse mémoire incorrecte (si utilisé comme Rm). Ces limitations nécessitent une attention particulière lors de l'écriture du code.
- Effet de l'utilisation de PC comme destination : Si PC est utilisé comme Rd, l'exécution bifurque vers l'adresse résultante du calcul. Lorsque le suffixe S est ajouté, le registre SPSR est copié dans le CPSR, ce qui permet de restaurer l'état du processeur après une exception. Cependant, il est fortement déconseillé d'utiliser le suffixe S avec PC en mode User ou System, car cela pourrait provoquer des comportements imprévisibles sans avertissement du compilateur.
- Formes spécifiques des instructions 16 bits en T32 : En mode T32, il existe des versions 16 bits des instructions LSL. Ces instructions imposent des contraintes sur les registres utilisés : seuls les registres dits "Lo" (généralement R0 à R7) peuvent être utilisés. De plus, certaines formes sont restreintes selon qu'elles apparaissent dans un IT block ou non. Ces restrictions rendent l'utilisation de LSL en mode Thumb-2 plus complexe que dans le mode A32.
Exemple
L'exemple suivant permet d'effectuer un décalage logique à gauche, ce qui revient à multiplier par une puissance de 2 :
Dernière mise à jour : Dimanche, le 12 novembre 2017