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