多寄存器寻址:LDMIA,LDMIB,STMIA,STMIB,LDMDA,LDMDB,STMDA,STMDB;
堆栈寻址:LDMFA,LDMFD,STMFA,STMFD,LDMEA,LDMED,STMEA,STMED;
LDM和STM指令
LDM批量加载/STM批量存储指令可以实现一组寄存器和一块连续的内存单元之间传输数据。
允许一条指令传送16个寄存器的任意子集和所有寄存器,指令格式如下:
LDM{cond} mode Rn{!}, reglist{^}
STM{cond} mode Rn{!}, reglist{^}
其中:
Rn:基址寄存器,装有传送数据的起始地址,Rn不允许为R15;
!:表示最后的地址写回到Rn中;
reglist:可包含多于一个寄存器范围,用“,”隔开,如{R1,R2,R6-R9},寄存器由小到大顺序排列;
^:不允许在用户模式和系统模式下运行
主要用途:现场保护、数据复制、参数传送等,共有8中模式(前面4种用于数据块的传输,后面4种是堆栈操作)如下:
IA: 每次传送后地址加4;
IB: 每次传送前地址加4;
DA: 每次传送后地址减4;
DB: 每次传送前地址减4;
FD: 满递减堆栈;
ED: 空递减堆栈;
FA: 满递增堆栈;
EA: 空递增堆栈。
例如:
1、多寄存器寻址:
LDMIA R0!,{R1-R4}
;R1<----[R0]
;R2<----[R0+4]
;R3<----[R0+8]
;R4<----[R0+12]
所有的示例指令执行前:
mem32[0x1000C] = 0x04
mem32[0x10008] = 0x03
mem32[0x10004] = 0x02
mem32[0x10000] = 0x01
r0 = 0x00010010
r1 = 0x00000000
r3 = 0x00000000
r4 = 0x00000000
(1) ldmia r0!, {r1-r3}
执行后:
r0 = 0x00100000
r1 = 0x01
r2 = 0x02
r3 = 0x03
(2) ldmib r0!, {r1-r3}
执行后:
r0 = 0x00100000
r1 = 0x02
r2 = 0x03
r3 = 0x04
2、堆栈寻址:
STMFD入栈指令,相当于STMDB
STMFD SP!,{R2-R4}
;[SP-4]<—R4
;[SP-8]<—R3
;[SP-12]<—R2
LDMFD出栈指令,相当于LDMIA
LDMFD SP!,{R6-R8}
;R6<----[SP]
;R7<----[SP+4]
;R8<----[SP+8]