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
nome do arquivo (número da linha): [aviso de erro|] Um nú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