Share via


Диагностические сообщения ассемблера ARM

Сборщики Microsoft ARM, armasm и armasm64 выдают диагностические предупреждения и ошибки при их обнаружении. В этой статье описываются наиболее часто встречающиеся сообщения.

Синтаксис

filename(line-number) : [предупреждение об ошибке|] Число:сообщение

Диагностические сообщения — ошибки

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 не разрешен в регионе THU МБ

Код отпечатка должен использовать синтаксис унифицированного языка сборщика (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 директива будет соблюдаться.

Чтобы устранить это предупреждение, можно указать директиву AREAALIGN атрибута, равного или больше требуемого выравнивания.

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