多寄存器和堆栈寻址的用法:多寄存器寻址:LDMIA,LDMIB,STMIA,STMIB,LDMDA,LDMDB,STMDA,STMDB;
堆栈寻址:LDMFA,LDMFD,STMFA,STMFD,LDMEA,LDMED,STMEA,STMED;
弄清堆栈寻址的SP的变化:LDMFA,LDMFD,STMFA,STMFD,LDMEA,LDMED,STMEA,STMED;
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} 2) ldmib r0!, {r1-r3}
执行后: 执行后:
r0 = 0x00100000 r0 = 0x00100000
r1 = 0x01 r1 = 0x02
r2 = 0x02 r2 = 0x03
r3 = 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]
多寄存器加载/存储指令格式如下:
多寄存器加载/存储指令的8种模式如下表所示,右边四种为堆栈操作、左边四种为数据传送操作。
模式
|
说明
|
模式
|
说明
|
IA
|
每次传送后地址加4
|
FD
|
满递减堆栈
|
IB
|
每次传送前地址加4
|
ED
|
空递减堆栈
|
DA
|
每次传送后地址减4
|
FA
|
满递增堆栈
|
DB
|
每次传送前地址减4
|
EA
|
空递增堆栈
|
数据块传送操作
|
堆栈操作
|
进行堆栈操作操作时,要先设置堆栈指针(SP),然后使用堆栈寻址指令STMFD/LDMFD 、STMED/LDMED、STMFA/LDMFA和STMEA/LDMEA实现堆栈操作。
数据块传送
存储
|
堆栈操作
压栈
|
说明
|
数据块传送
加载
|
堆栈操作
出栈
|
说明
|
|
STMDA
|
STMED
|
空递减
|
LDMDA
|
LDMFA
|
满递减
|
|
STMIA
|
STMEA
|
空递增
|
LDMIA
|
LDMFD
|
满递增
|
|
STMDB
|
STMFD
|
满递减
|
LDMDB
|
LDMEA
|
空递减
|
|
STMIB
|
STMFA
|
满递增
|
LDMIB
|
LDMED
|
空递增
|