ARM汇编Rx与[Rx]寻址差异:LDR R0,R1与LDR R0,[R1]的区别与疑问
ARM汇编LDR指令的操作数差异与常见疑问解答
核心疑问先明确结论
针对你提出的两个具体判断,先给出明确正误:
- 关于
LDR R0, R1(语句1)的疑问:
这个表述本身存在概念偏差——寄存器是CPU内核内部的高速存储单元,不存在可被存储的“自身地址”,且这条语句在标准ARM32指令集下是不符合语法的非法指令,既不能实现你说的“存入R1的地址”的功能,本身就无法通过汇编编译。 - 关于
LDR R0, [R1](语句2)的疑问:
你的描述完全正确。这条语句是标准的寄存器间接寻址加载指令,功能就是将R1中存储的内存地址对应的4字节连续数据,加载到R0寄存器中,执行过程会实际触发内存总线的读操作。
两类写法的本质差异
ARM汇编里的方括号[]是明确的内存访问标识,核心作用是告知汇编器:括号内寄存器存储的数值是内存地址,需要触发内存读写流程,而非直接操作寄存器本身的数值。
对应两条指令的行为拆解
LDR R0, R1(语句1)的常见误写溯源
这条写法一般是新手的概念混淆导致的笔误,常见的正确对应场景有两类:- 若本意是将R1的寄存器值直接拷贝到R0,正确指令是
MOV R0, R1:全程仅在CPU内核的寄存器间传输数据,不会访问任何内存空间。 - 若本意是通过LDR伪指令加载某个标号对应的内存地址,正确写法是
LDR R0, =标号名:此时功能是将标号对应的地址值作为立即数写入R0,不会访问该地址指向的内存内容。
- 若本意是将R1的寄存器值直接拷贝到R0,正确指令是
LDR R0, [R1](语句2)的实际执行流程
这是ARM加载指令最常用的寄存器间接寻址写法,执行步骤为:- 读取R1寄存器中存储的32位数值,将其作为目标内存的访问地址
- 触发内存读操作,从该地址起始位置读取连续4字节的数据
- 将读取到的4字节数据按照端序拼接为32位值,写入R0寄存器
内容的提问来源于stack exchange,提问作者Vighnesh Nayak
相关产品推荐
相关产品推荐

