ARM汇编入门:从ldr/str指令到嵌入式开发的5个实战场景
第一次接触ARM汇编时,那些密密麻麻的指令总让人望而生畏。但当你真正理解了几条核心指令后,整个汇编世界就会突然变得清晰起来。ldr和str就是这样两条能帮你打开ARM汇编大门的钥匙——它们看起来简单,却能完成90%的内存操作任务。
1. 为什么ldr和str是ARM开发的基石
在嵌入式开发中,我们经常需要与内存打交道:读取传感器数据、配置外设寄存器、保存临时变量...这些操作本质上都是对特定内存地址的读写。而ldr(load register)和str(store register)正是ARM架构中专门用于内存访问的指令对。
与高级语言中的变量赋值不同,汇编层面的内存操作需要开发者明确知道数据存放的物理位置。举个例子,在C语言中我们写:
c复制int value = *pointer;
对应的ARM汇编则是:
assembly复制ldr r0, [r1] @ 将r1指向的内存值加载到r0
关键区别在于:
- C编译器会自动处理数据类型、地址对齐等细节
- 汇编程序员必须明确知道:
- 目标地址是否有效(r1的值)
- 操作的数据宽度(32位/16位/8位)
- 内存访问权限(是否可读可写)
在STM32等Cortex-M芯片的启动代码中,你经常会看到这样的外设配置:
assembly复制ldr r0, =0x40021000 @ RCC寄存器基地址
ldr r1, [r0, #0x18] @ 读取APB2ENR寄存器
orr r1, r1, #0x0004 @ 设置GPIOC时钟使能位
str r1, [r0, #0x18] @ 写回寄存器
这段代码展示了ldr/str最典型的应用场景——通过内存映射寄存器控制硬件外设。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 五种寻址模式的实际应用
ARM提供了灵活的寻址方式,让ldr/str能适应各种内存访问需求。理解这些模式是写出高效汇编代码的关键。
2.1 立即数偏移寻址
这是最基础的寻址方式,适合访问结构体成员或数组元素:
assembly复制ldr r2, [r0, #8] @ 读取r0+8地址处的值
在配置串口时,我们可能这样设置波特率:
assembly复制
