Mensagens de diagnóstico do assembler ARM

Os assemblers armasm e armasm64 do Microsoft ARM emitem avisos de diagnóstico e erros quando os encontram. Este artigo descreve as mensagens mais comumente encontradas.

Sintaxe

filename(line-number) : [aviso|de erro] Umnúmero:mensagem

Mensagens de diagnóstico – Erros

A2193: esta instrução gera um comportamento imprevisível

A arquitetura do ARM não pode garantir o que acontece quando essa instrução é executada. Para obter informações sobre as formas bem definidas desta instrução, consulte o Manual de referência de arquitetura do ARM.

    ADD r0, r8, pc         ; A2193: this instruction generates unpredictable behavior

A2196: não é possível codificar a instrução em 16 bits

Não é possível codificar a instrução especificada como uma instrução thumb de 16 bits. Especifique uma instrução de 32 bits ou reorganize o código para trazer o rótulo de destino para o intervalo de uma instrução de 16 bits.

O assembler pode tentar codificar um branch em 16 bits e falhar com esse erro, mesmo que um branch de 32 bits seja codificado. É possível resolver esse problema usando o especificador .W para marcar explicitamente o branch como de 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: sintaxe de instrução pré-UAL não permitida na região de THUMB

O código thumb deve usar a sintaxe UAL (Unified Assembler Language). A sintaxe antiga não é mais aceita

    ADDEQS r0, r1         ; A2202: Pre-UAL instruction syntax not allowed in THUMB region
    ADDSEQ r0, r1         ; OK

A2513: a rotação deve ser uniforme

No modo ARM, há uma sintaxe alternativa para especificar constantes. Em vez de gravar #<const>, é possível gravar #<byte>,#<rot>, que representa o valor constante obtido ao girar o valor <byte> por <rot>. Ao usar essa sintaxe, é necessário deixar o valor de <rot> uniforme.

    MOV r0, #4, #2       ; OK
    MOV r0, #4, #1       ; A2513: Rotation must be even

A2557: número incorreto de bytes para write-back

Na estrutura NEON, carregue e armazene instruções (VLDn, VSTn), há uma sintaxe alternativa para especificar o write-back no registro base. Em vez de colocar um ponto de exclamação (!) após o endereço, especifique um valor imediato que indique o deslocamento que será adicionado ao registro base. Se usar essa sintaxe, você deverá especificar o número exato de bytes que foram carregados ou armazenados pela instrução.

    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

Mensagens de diagnóstico – Avisos

A4228: o valor de alinhamento excede o alinhamento de ÁREA; alinhamento não garantido

O alinhamento especificado em uma diretiva ALIGN é maior do que o alinhamento do delimitador AREA. Consequentemente, o assembler não pode garantir que a diretiva ALIGN será respeitada.

Para corrigir esse aviso, especifique na diretiva AREA um atributo ALIGN igual ou maior que o alinhamento desejado.

AREA |.myarea1|
ALIGN 8           ; A4228: Alignment value exceeds AREA alignment; alignment not guaranteed

AREA |.myarea2|,ALIGN=3
ALIGN 8           ; OK

A4508: o uso dessa constante girada é preterido

No modo ARM, há uma sintaxe alternativa para especificar constantes. Em vez de gravar #<const>, é possível gravar #<byte>,#<rot>, que representa o valor constante obtido ao girar o valor <byte> por <rot>. Em alguns contextos, o ARM preteriu o uso dessas constantes giradas. Nesses casos, use a sintaxe básica #<const>.

    ANDS r0, r0, #1                ; OK
    ANDS r0, r0, #4, #2            ; A4508: Use of this rotated constant is deprecated

A4509: esta forma de instrução condicional foi preterida

Essa forma de instrução condicional foi preterida pelo ARM na arquitetura ARMv8. Recomendamos que você altere o código para usar branches condicionais. Para ver quais instruções condicionais ainda são compatíveis, consulte o Manual de referência de arquitetura do ARM.

Esse aviso não é emitido quando a opção de linha de comando -oldit é usada.

    ADDEQ r0, r1, r8              ; A4509: This form of conditional instruction is deprecated

Confira também

Referência de linha de comando do assembler ARM
Diretivas do assembler ARM