Assembly “的使用=&引用;签到臂组件
我在谷歌上搜索了一下,但什么也找不到,我是汇编新手,我有一个符号定义,我认为它等同于C的define语句Assembly “的使用=&引用;签到臂组件,assembly,arm,Assembly,Arm,我在谷歌上搜索了一下,但什么也找不到,我是汇编新手,我有一个符号定义,我认为它等同于C的define语句 FIRST EQU 0x20000480 在u_main中,我想将这个0x20000480值加载到R1寄存器中,因此我有以下代码 LDR R1, FIRST 这就产生了一个错误 main.s(65):错误:A1150E:错误符号,未定义或外部 如果我在第一个前面插入一个“=” LDR R1, =FIRST 然后它就可以很好地构
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汇编语法。@老新手通常在搜索时甚至不知道正确的关键字。我们别那么苛刻了。