问题描述
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
(来自 GNU as
)的错误消息。当您的源文件不包含该标签时,这与您收到的 ldr r0,foo
错误消息相同。
(如果您在源代码中的某处确实有 R1:
标签,则此 ldr R0,R1
加载将引用它。再次反汇编,如果该标签在 2 个之后,您将得到 ldr r0,[pc,#4]
说明。同样,与使用 foo
而不是 R1
作为符号名称完全相同。使用寄存器名称作为符号对于人类可读性来说是一个坏主意,但如果你真的这样做了,就会发生这种情况使用 GNU 汇编器(来自 GNU binutils)。How does the LDR instruction load constants into registers? 显示了一个示例)
如果您想复制寄存器,请使用 mov r0,r1
,这是与 ldr
不同的助记符(和机器代码操作码)。
脚注 1: 或者有一种 ldr 的伪指令形式,例如 ldr r0,=0x1234
将常量放入带有汇编器选择的指令的寄存器中,或者在某些汇编器中始终是 PC -来自附近“文字池”的相对负载。但是 asm 源中的那种 ldr
要么汇编为 ldr r0,#offset]
,要么汇编为一些根本不是 ldr
的指令。 What does an equals sign = on the right side of a LDR instruction in ARM mean?