ARM汇编中“=”号的使用

The use of "=" sign in ARM assembly

我用谷歌搜索但找不到任何东西,我是汇编新手,我有一个符号定义,我认为它等于 C 的#define 语句。

FIRST       EQU         0x20000480

在__main中,我想将这个0x20000480值加载到R1寄存器中,所以我有以下代码,

LDR         R1, FIRST

这给出了

的错误

main.s(65): error: A1150E: Bad symbol, not defined or external

如果我在 FIRST 前面插入一个“=”,

LDR         R1, =FIRST

然后构建正常。

谁能在这里解释一下“=”运算符(如果它是运算符)的用法?

“=”表示可能的文字池访问。 ldr 指令在这种情况下是伪指令,它转换为 movmvnldr [pc, #offset]

之一

源代码:

ldr     r0, =0xff
ldr     r1, =0xffffffff
ldr     r2, =0xf00000ff

反汇编:

mov     r0, #0xff
mvn     r1, #0x00
ldr     r2, [pc, #offset]

0xff可以用space的12位和0(~0xffffffff)表示,因此分别翻译成movmvn
http://www.davespace.co.uk/arm/introduction-to-arm/immediates.html

另一方面,因为 0xf00000ff 不是这种情况,所以应以 pc 相对负载的形式进行文字池访问。

然而,在 armv7 上,由于 movwmovt 指令,您可以使用任何 32 位值加载寄存器,这比内存访问更可取

movw    r2, #0xffff // ANY 16bit value
movt    r2, #0xf000 // ANY 16bit value to the upper part without corrupting the lower one