Диагностические сообщения ассемблера ARM
Сборщики Microsoft ARM, armasm и armasm64 выдают диагностические предупреждения и ошибки при их обнаружении. В этой статье описываются наиболее часто встречающиеся сообщения.
Синтаксис
filename (номер строки) : [предупреждение об ошибке|] Число: сообщение
Диагностические сообщения — ошибки
A2193: эта инструкция создает непредсказуемое поведение
Архитектура ARM не может гарантировать, что происходит при выполнении этой инструкции. Дополнительные сведения о хорошо определенных формах этой инструкции см. в руководстве по архитектуре ARM.
ADD r0, r8, pc ; A2193: this instruction generates unpredictable behavior
A2196: инструкция не может быть закодирована в 16 битах
Указанная инструкция не может быть закодирована как 16-разрядная инструкция отпечатка. Укажите 32-разрядную инструкцию или переупорядочение кода, чтобы перенести целевую метку в диапазон 16-разрядной инструкции.
Сборщик может попытаться закодировать ветвь в 16 битах и завершиться ошибкой, даже если 32-разрядная ветвь закодирована. Эту проблему можно решить с помощью .W
описателя, чтобы явно пометить ветвь как 32-разрядную.
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: синтаксис инструкций pre-UAL не разрешен в регионе THUMB
Код отпечатка должен использовать синтаксис унифицированного языка сборщика (UAL). Старый синтаксис больше не принимается
ADDEQS r0, r1 ; A2202: Pre-UAL instruction syntax not allowed in THUMB region
ADDSEQ r0, r1 ; OK
A2513: поворот должен быть даже
В режиме ARM существует альтернативный синтаксис для указания констант. Вместо записи #<const>
можно написать #<byte>,#<rot>
, представляющее константное значение, полученное путем поворота значения <byte>
вправо <rot>
. При использовании этого синтаксиса необходимо сделать <rot>
значение даже.
MOV r0, #4, #2 ; OK
MOV r0, #4, #1 ; A2513: Rotation must be even
A2557: неверное число байтов для обратной записи
В структуре NEON загружаются и хранятся инструкции (VLDn
, VSTn
есть альтернативный синтаксис для указания обратной записи в базовый регистр. Вместо того чтобы поместить восклицательный знак (!) после адреса, можно указать немедленное значение, указывающее смещение, которое будет добавлено в базовый регистр. При использовании этого синтаксиса необходимо указать точное количество байтов, загруженных или сохраненных инструкцией.
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
Диагностические сообщения — предупреждения
A4228: значение выравнивания превышает выравнивание ОБЛАСТИ; Выравнивание не гарантируется
Выравнивание, указанное в ALIGN
директиве, больше, чем выравнивание заключенного AREA
. В результате сборщик не может гарантировать, что ALIGN
директива будет соблюдаться.
Чтобы устранить это предупреждение, можно указать директиву AREA
ALIGN
атрибута, равного или больше требуемого выравнивания.
AREA |.myarea1|
ALIGN 8 ; A4228: Alignment value exceeds AREA alignment; alignment not guaranteed
AREA |.myarea2|,ALIGN=3
ALIGN 8 ; OK
A4508: использование этой вращаемой константы не рекомендуется
В режиме ARM существует альтернативный синтаксис для указания констант. Вместо записи #<const>
можно написать #<byte>,#<rot>
, представляющее константное значение, полученное путем поворота значения <byte>
вправо <rot>
. В некоторых контекстах ARM не рекомендует использовать эти поворачиваемые константы. В этих случаях используйте базовый #<const>
синтаксис.
ANDS r0, r0, #1 ; OK
ANDS r0, r0, #4, #2 ; A4508: Use of this rotated constant is deprecated
A4509: эта форма условной инструкции не рекомендуется
Эта форма условной инструкции не рекомендуется использовать ARM в архитектуре ARMv8. Рекомендуется изменить код для использования условных ветвей. Чтобы узнать, какие условные инструкции по-прежнему поддерживаются, обратитесь к руководству по архитектуре ARM.
Это предупреждение не создается при использовании коммутатора командной -oldit
строки.
ADDEQ r0, r1, r8 ; A4509: This form of conditional instruction is deprecated
См. также
Справочник по командной строке ассемблера ARM
Директивы ассемблера ARM