Rx 和 [Rx] 之间的区别

问题描述

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?

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...