Messages de diagnostic de l’assembleur ARM
Les assembleurs Microsoft ARM, armasm et armasm64, émettent des avertissements et des erreurs de diagnostic lorsqu’ils les rencontrent. Cet article décrit les messages les plus couramment rencontrés.
Syntaxe
filename ( line-number ) : [avertissement d’erreur|] Nombre : message
Messages de diagnostic - Erreurs
A2193 : cette instruction génère un comportement imprévisible
L’architecture ARM ne peut pas garantir ce qui se passe quand cette instruction est exécutée. Pour plus d’informations sur les formes bien définies de cette instruction, consultez le manuel de référence de l’architecture ARM.
ADD r0, r8, pc ; A2193: this instruction generates unpredictable behavior
A2196 : l’instruction ne peut pas être encodée en 16 bits
L’instruction spécifiée ne peut pas être encodée en tant qu’instruction pouce 16 bits. Spécifiez une instruction 32 bits ou réorganisez le code pour placer l’étiquette cible dans la plage d’une instruction 16 bits.
L’assembleur peut tenter d’encoder une branche en 16 bits et échouer avec cette erreur, même si une branche 32 bits est encodable. Vous pouvez résoudre ce problème à l’aide du .W
spécificateur pour marquer explicitement la branche comme 32 bits.
ADD.N r0, r1, r2 ; A2196: instruction can't be encoded in 16 bits
B.W label ; OK
B.N label ; A2196: instruction can't be encoded in 16 bits
SPACE 10000
label
A2202 : Syntaxe d’instruction pré-UAL non autorisée dans la région THUMB
Le code numérique doit utiliser la syntaxe UAL (Unified Assemble Language). L’ancienne syntaxe n’est plus acceptée
ADDEQS r0, r1 ; A2202: Pre-UAL instruction syntax not allowed in THUMB region
ADDSEQ r0, r1 ; OK
A2513 : La rotation doit être même
En mode ARM, il existe une autre syntaxe pour spécifier des constantes. Au lieu d’écrire #<const>
, vous pouvez écrire #<byte>,#<rot>
, qui représente la valeur constante obtenue en faisant pivoter la valeur <byte>
à droite par <rot>
. Lorsque vous utilisez cette syntaxe, vous devez rendre la valeur de <rot>
même.
MOV r0, #4, #2 ; OK
MOV r0, #4, #1 ; A2513: Rotation must be even
A2557 : Nombre incorrect d’octets à réécrire
Dans les instructions de chargement et de stockage de la structure NEON (VLDn
, VSTn
), il existe une autre syntaxe pour spécifier l’écriture différée dans le registre de base. Au lieu de placer un point d’exclamation ( !) après l’adresse, vous pouvez spécifier une valeur immédiate qui indique le décalage à ajouter au registre de base. Si vous utilisez cette syntaxe, vous devez spécifier le nombre exact d’octets chargés ou stockés par l’instruction.
VLD1.8 {d0-d3}, [r0]! ; OK
VLD1.8 {d0-d3}, [r0], #32 ; OK
VLD1.8 {d0-d3}, [r0], #100 ; A2557: Incorrect number of bytes to write back
Messages de diagnostic - Avertissements
A4228 : La valeur d’alignement dépasse l’alignement AREA ; alignement non garanti
L’alignement spécifié dans une ALIGN
directive est supérieur à l’alignement du englobant AREA
. Par conséquent, l’assembleur ne peut pas garantir que la ALIGN
directive sera respectée.
Pour corriger cet avertissement, vous pouvez spécifier sur la AREA
directive un ALIGN
attribut égal ou supérieur à l’alignement souhaité.
AREA |.myarea1|
ALIGN 8 ; A4228: Alignment value exceeds AREA alignment; alignment not guaranteed
AREA |.myarea2|,ALIGN=3
ALIGN 8 ; OK
A4508 : L’utilisation de cette constante pivotée est déconseillée
En mode ARM, il existe une autre syntaxe pour spécifier des constantes. Au lieu d’écrire #<const>
, vous pouvez écrire #<byte>,#<rot>
, qui représente la valeur constante obtenue en faisant pivoter la valeur <byte>
à droite par <rot>
. Dans certains contextes, ARM a déconseillé l’utilisation de ces constantes pivotées. Dans ces cas, utilisez plutôt la syntaxe de base #<const>
.
ANDS r0, r0, #1 ; OK
ANDS r0, r0, #4, #2 ; A4508: Use of this rotated constant is deprecated
A4509 : Cette forme d’instruction conditionnelle est déconseillée
Cette forme d’instruction conditionnelle a été déconseillée par ARM dans l’architecture ARMv8. Nous vous recommandons de modifier le code pour utiliser des branches conditionnelles. Pour voir quelles instructions conditionnelles sont toujours prises en charge, consultez le manuel de référence de l’architecture ARM.
Cet avertissement n’est pas émis lorsque le -oldit
commutateur de ligne de commande est utilisé.
ADDEQ r0, r1, r8 ; A4509: This form of conditional instruction is deprecated
Voir aussi
Référence de la ligne de commande de l’assembleur ARM
Directive d’assembleur ARM