1. ARM内存访问指令概述
在ARM汇编语言中,内存访问指令是处理器与内存交互的核心桥梁。作为RISC架构的代表,ARM处理器采用"加载-存储"架构设计,这意味着所有算术和逻辑运算都只能在寄存器中进行,而内存数据必须通过专门的加载(Load)和存储(Store)指令在寄存器和内存之间传输。
这种设计带来了几个关键特性:
- 指令集精简:内存访问指令种类有限但功能强大
- 高效流水线:分离的数据通路提高指令级并行度
- 灵活寻址:支持多种内存地址计算方式
在ARMv7-A架构中,内存访问指令约占全部指令集的15%,虽然比例不高,但却是程序性能的关键影响因素。一个典型应用程序的指令执行统计显示,约1/3的指令是内存访问指令,这充分说明了其重要性。
提示:ARMv8架构引入了新的加载存储指令,但基础原理与v7相似,本文以广泛使用的v7为例讲解。
2. 基本加载与存储指令
2.1 LDR/STR指令格式
LDR(Load Register)和STR(Store Register)是最基础的内存访问指令,其基本语法为:
assembly复制LDR{条件} 目标寄存器, [基址寄存器, 偏移量]
STR{条件} 源寄存器, [基址寄存器, 偏移量]
例如:
assembly复制LDR R0, [R1] @ 将R1指向的内存内容加载到R0
STR R2, [R3, #4] @ 将R2的值存储到R3+4的内存地址
2.2 字节与半字访问
除了32位字访问,ARM还支持更细粒度的内存操作:
assembly复制LDRB/STRB ; 字节(8位)加载/存储
LDRH/STRH ; 半字(16位)加载/存储
LDRSB/LDRSH ; 有符号字节/半字加载
使用示例:
assembly复制LDRB R0, [R1] @ 加载R1地址处的字节到R0低8位
STRH R2, [R3] @ 存储R2的低16位到R3地址
2.3 立即数偏移与寄存器偏移
偏移量支持两种形式:
- 立即数偏移:#数字(如#12)
- 寄存器偏移:Rm(可带移位,如R2, LSL #2)
assembly复制LDR R0, [R1, R2] @
