Assembly “的使用=&引用;签到臂组件

Assembly “的使用=&引用;签到臂组件,assembly,arm,Assembly,Arm,我在谷歌上搜索了一下,但什么也找不到,我是汇编新手,我有一个符号定义,我认为它等同于C的define语句 FIRST EQU 0x20000480 在u_main中,我想将这个0x20000480值加载到R1寄存器中,因此我有以下代码 LDR R1, FIRST 这就产生了一个错误 main.s(65):错误:A1150E:错误符号,未定义或外部 如果我在第一个前面插入一个“=” LDR R1, =FIRST 然后它就可以很好地构

我在谷歌上搜索了一下,但什么也找不到,我是汇编新手,我有一个符号定义,我认为它等同于C的define语句

FIRST       EQU         0x20000480
在u_main中,我想将这个0x20000480值加载到R1寄存器中,因此我有以下代码

LDR         R1, FIRST
这就产生了一个错误

main.s(65):错误:A1150E:错误符号,未定义或外部

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

LDR         R1, =FIRST
然后它就可以很好地构建

有人能解释一下“=”运算符(如果是运算符)的用法吗?

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

源代码:

ldr     r0, =0xff
ldr     r1, =0xffffffff
ldr     r2, =0xf00000ff
拆卸:

mov     r0, #0xff
mvn     r1, #0x00
ldr     r2, [pc, #offset]
0xff可以用12位空格和0(~0xffffffff)表示,因此它分别转换为
mov
mvn

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

然而,在
armv7
上,由于
movw
movt
指令优于内存访问,您可以使用任何32位值加载寄存器

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

LDR R1,FIRST
是一条从内存加载的实际指令,
LDR R1,=FIRST
是一条psedoon指令,将由汇编程序实现并加载地址。因此,您试图在汇编语言中编程,而没有汇编程序直接使用的语法的明确文档?似乎汇编语言编程不够难。汇编是特定于工具(而不是目标)的。如果所有人都支持伪指令,则并非所有人都能平等地处理该伪指令。请注意,本主题已在此处多次介绍。问之前请先看一看。@andymango也许只是我,但手臂装配是最简单的。OP似乎在使用Keil或ARM Development Studio,给出了
eq
指令。我也花了一段时间才习惯GCC汇编语法。@老新手通常在搜索时甚至不知道正确的关键字。我们别那么苛刻了。