一、概念总述ARM 汇编中LDR存在两种完全不同身份书写格式是核心区分依据CPU 原生硬件指令 LDR格式含方括号[]硬件原生支持功能为从内存读取数据到寄存器汇编伪指令 LDR格式含等号仅汇编器识别、无对应机器码功能为将 32 位常数 / 标号地址载入寄存器。二、LDR 硬件访存指令CPU 原生指令1. 标准语法LDR{cond}{T} Rd, 寻址模式常见寻址格式LDR Rd, [Rn] ; 基址寻址 LDR Rd, [Rn, #imm] ; 基址立即数偏移 LDR Rd, [Rn, #imm]! ; 带回写偏移 LDR Rd, [Rn], #imm ; 后索引偏移 LDR Rd, [Rn, Rm, LSL #n] ; 寄存器移位偏移2. 核心特性拥有独立机器码CPU 硬件直接执行操作逻辑访问存储器总线读取内存 / 外设地址上的 32 位数据存入寄存器寻址偏移范围受指令编码限制仅支持小范围偏移典型用途读取全局变量、寄存器外设、数组内存数据。3. 示例LDR R0, [R1, #4] ; 将R14地址处的32位数据加载至R0 LDR R2, [SP], #8 ; 读取栈数据读取后SP自动8三、LDR, 汇编伪指令重点1. 标准语法LDR{cond} Rd, expr{cond}可选条件执行后缀EQ/NE/GT 等Rd目标通用寄存器expr支持 32 位立即数、程序标号、算术运算表达式。2. 核心功能把表达式expr对应的完整 32 位数值加载到寄存器Rd弥补MOV/MVN无法装载任意 32 位大数的缺陷。3. 汇编器自动转换逻辑核心规则汇编阶段汇编器会先判断expr是否为 ARM 合法 8 位循环立即数分两种分支处理分支 aexpr 是合法 ARM 立即数汇编器直接优化为单条MOV负数合法立即数会优化为MVN不生成字面池。 转换规则LDR Rd, expr → MOV Rd, #expr示例LDR R0, 0x000000FF ; 汇编后等价硬件指令 MOV R0, #0xFF LDR R1, 0xFFFFFF00 ; 汇编后等价硬件指令 MVN R1, #0xFF分支 bexpr 不是合法 ARM 立即数超大常数 / 标号地址汇编器自动完成两步处理在当前代码段空白区域创建字面池 (literal pool)使用DCD expr存储该 32 位常量生成一条原生硬件LDR指令通过 PC 相对偏移寻址读取字面池内数据。 转换展开逻辑; 源码 LDR R0, 0x12345678 ; 汇编展开真实代码 LDR R0, [PC, #offset_to_litpool] ; 中间业务代码... ltpool DCD 0x12345678 ; 字面池存放32位常量4. 典型使用场景加载超出 MOV 范围的 32 位超大立即数加载全局变量、函数、标号的绝对内存地址给寄存器赋外设基地址。5. 常见报错literal pool out of range当代码段过长PC 到字面池的偏移超出硬件 LDR 寻址范围时汇编报错。 解决方法在代码中间插入LTORG手动强制生成字面池。四、硬件 LDR 指令 vs LDR, 伪指令对比表书写标识类型核心作用机器码关键行为LDR Rd,[Rn]CPU 硬件指令读取内存地址上存储的数据原生存在访问内存总线读外部存储数据LDR Rd,expr汇编伪指令加载 32 位常数 / 标号地址到寄存器无汇编后转换借助字面池中转加载常量五、快速区分记忆口诀带方括号[]真实 LDR访存读数据 带等号伪指令 LDR载入 32 位常数 / 地址。六、补充易错知识点MOV仅支持 ARM 规则下的 8 位循环移位立即数无法加载任意 32 位数值因此地址、大数只能用LDR Rd,xxx伪指令LDR,label获取的是标号地址硬件指令LDR R0,[label]是读取该地址上存储的数值二者逻辑完全相反字面池属于只读常量段存放程序用到的 32 位常数不占用 RAM仅占用 Flash/ROM 空间。