ARM 汇编程序诊断消息
Microsoft ARM 汇编程序 armasm 和 armasm64 会在遇到诊断警告和错误时将其发出。 本文介绍最常遇见的消息。
语法
filename (行号) : [错误|警告] 数字: 消息
诊断消息 - 错误
A2193:此指令会生成不可预知的行为
ARM 架构无法保证执行此指令时会发生什么情况。 有关此指令定义完善的形式的详细信息,请参阅 ARM 架构参考手册。
ADD r0, r8, pc ; A2193: this instruction generates unpredictable behavior
A2196:指令不能以 16 位编码
指定的指令不能编码为 16 位 Thumb 指令。 指定 32 位指令或重新排列代码,使目标标签处于 16 位指令的范围内。
尽管 32 位分支可编码,但汇编程序可能尝试以 16 位对分支进行编码并因出现此错误而失败。 可以通过使用 .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:THUMB 区域中不允许 Pre-UAL 指令语法
Thumb 代码必须使用统一汇编程序语言 (UAL) 语法。 不再接受旧语法
ADDEQS r0, r1 ; A2202: Pre-UAL instruction syntax not allowed in THUMB region
ADDSEQ r0, r1 ; OK
A2513:旋转必须是偶数
在 ARM 模式下,有一种备用语法用于指定常量。 可以写入 #<byte>,#<rot>
(而不是写入 #<const>
),它表示通过将值 <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:对齐值超过 AREA 对齐;不保证对齐
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 模式下,有一种备用语法用于指定常量。 可以写入 #<byte>,#<rot>
(而不是写入 #<const>
),它表示通过将值 <byte>
向右旋转 <rot>
而获得的常量值。 在某些上下文中,ARM 已弃用这些旋转常量。 在这些情况下,请改用基本 #<const>
语法。
ANDS r0, r0, #1 ; OK
ANDS r0, r0, #4, #2 ; A4508: Use of this rotated constant is deprecated
A4509:此形式的条件指令已弃用
在 ARMv8 体系结构中,ARM 已弃用此形式的条件指令。 建议更改代码以使用条件分支。 若要查看哪些条件指令仍受支持,请参阅 ARM 架构参考手册。
使用 -oldit
命令行开关时不会发出此警告。
ADDEQ r0, r1, r8 ; A4509: This form of conditional instruction is deprecated