LDR R0, R1 ; statement 1
LDR R0, [R1] ; statement 2
两个语句的区别是什么?
在语句1中,寄存器的地址是否存储在R0中?
在语句2中,R1指向的4字节数据是否被加载到R0中?
是,ldr r0, [r1]
从内存中加载4个字节,使用R1作为地址。
ldr
的第二个操作数必须是内存,使用某种寻址模式1,而不是一个裸寄存器。
LDR R0, R1
是语法错误,或者试图使用R1作为符号名(像任何其他字符串,如ldr r0, foo
),而不是寄存器。如果您费心去尝试它,您会看到类似Error: internal_relocation (type: OFFSET_IMM) not fixed up
(来自GNUas
)的错误消息。当你的源文件不包含ldr r0, foo
标签时,你会得到同样的错误信息。
(如果您的源代码中有一个R1:
标签,这个ldr R0, R1
加载将引用它。再次拆卸,如果该标签在2个指令之后,您将得到ldr r0, [pc, #4]
。同样,如果您使用foo
而不是R1
作为符号名称,则完全相同。对于人类的可读性来说,使用寄存器名作为符号是一个坏主意,但是如果您实际使用GNU汇编程序(来自GNU binutils)这样做,就会发生这种情况。LDR指令如何将常量加载到寄存器中?显示一个示例)
如果你想复制寄存器,使用mov r0, r1
,一个不同于ldr
的助记符(和机器码操作码)。
脚注1:或者存在ldr的伪指令形式,如ldr r0, =0x1234
,将一个常量放入寄存器中,其中包含汇编程序选择的指令,或者在某些汇编程序中总是从附近的"文字池"中加载与pc相关的内容。但是,在asm源代码中,这种ldr
要么汇编成ldr r0, [pc, #offset]
,要么汇编成一些根本不是ldr
的指令。ARM中LDR指令右侧的等号=是什么意思?