ARM 汇编程序诊断消息

Microsoft ARM 汇编程序 armasm 和 armasm64 会在遇到诊断警告和错误时将其发出。 本文介绍最常遇见的消息。

语法

filename(line-number) : [error|warning] Anumber:message

诊断消息 - 错误

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

另请参阅

ARM 汇编程序命令行参考
ARM 汇编程序指令