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
指令在这种情况下是伪指令,它转换为 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可以用space的12位和0(~0xffffffff)表示,因此分别翻译成mov
和mvn
。
http://www.davespace.co.uk/arm/introduction-to-arm/immediates.html
另一方面,因为 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
我用谷歌搜索但找不到任何东西,我是汇编新手,我有一个符号定义,我认为它等于 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
指令在这种情况下是伪指令,它转换为 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可以用space的12位和0(~0xffffffff)表示,因此分别翻译成mov
和mvn
。
http://www.davespace.co.uk/arm/introduction-to-arm/immediates.html
另一方面,因为 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