【发布时间】:2021-03-04 04:56:30
【问题描述】:
LDR R0, R1 ; statement 1
LDR R0, [R1] ; statement 2
两个语句有什么区别?
在语句1中,寄存器的地址是否存储在R0中?
语句2中,R1指向的4字节数据是否加载到R0中?
【问题讨论】:
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, [pc, #offset] 要么汇编成一些根本不是 ldr 的指令。 What does an equals sign = on the right side of a LDR instruction in ARM mean?
【讨论】: