基于ARM汇编语言-多数据访问
概念:
LDM:将一块内存的数据,加载到多个寄存器中。
STM:将多个寄存器的值,存储到一块内存。
格式:
LDM{条件}{s}MODE基址寄存器{!},{Reglist}^
STM{条件}{s}MODE基址寄存器{!},{Reglist}^
MODE:
1.IA(increase after):先读写,后增加地址。
2.IB(increase before):先增加地址,后读写。
3.DA(decrease after):先读写,后减少地址。
4.DB(decrease before):先减少地址,后读写。图片来源:华清远见
基址寄存器:用来存放内存的 起始地址。
!:最后更新基址寄存器的值。
Reglist:
多个寄存器从小到大,中间用","隔开,如{r0,r1,r4}或{r0-r3,r5}。
寄存器号大的对应内存的高地址,寄存器号小的对应内存低地址。
^:在LDM指令中,有PC且在数据传送的时候,会将SPSR的值拷贝到CPSR,用于异常的返回。
.global _start
_start:
@mov r0,#0x40000000
mov r0,#0x40000020
mov r1,#1
mov r2,#2
mov r3,#3
mov r4,#4
mov r6,#6
@//stm,将多个寄存器的值,存储到一块内存
@stmia r0,{r1,r2}
@stmia r0,{r1-r4} @//将r1-r4寄存器保存到r0为基地址的内存中,r0的值不变
@stmia r0!,{r1-r4,r6} @//这里r0的值会更新地址
@stmib r0!,{r1-r4,r6} @//先加再存储
@stmda r0!,{r1-r4,r6} @//先存储再减
stmdb r0!,{r1-r4,r6} @//先减再存储
mov r1,#0
mov r2,#0
mov r3,#0
mov r4,#0
mov r6,#0
@//ldm,将一块内存的数据,加载到多个寄存器中
@ldmdb r0!,{r1-r4,r6} @//先减少地址,再进行读取
@ldmda r0!,{r1-r4,r6} @//先读写再减
@ldmib r0!,{r1-r4,r6} @//先加再读取
ldmia r0!,{r1-r4,r6} @//先读再加
stop:
b stop