LDM/STM指令可以实现在一组寄存器和一块连续的内存单元之间传输数据。
LDM:批量加载,从内存到寄存器
STM:批量存储,从寄存器到内存
格式如下:
LDM{cond}<模式> Rn{!},reglist{^}
STM{cond}<模式> Rn{!},reglist{^}
主要用途:现场保护、数据复制、参数传递
模式有8种:(前四种用于数据块传输,后四种是堆栈操作)
(1) IA:每次传送后地址加四
(2) IB:每次传送前地址加四
(3) DA:每次传送后地址减四
(4) DB:每次传送前地址加四
(5) FD:满递减堆栈
(6) ED:空递减堆栈
(7) FA:满递增堆栈
(8) EA:空递减堆栈
1、"!"的意思:有"!",每次指令执行后,Rn的值更新。若无,则Rn值不更新。
"^":不允许在用户模式和系统模式下运行。
Rn:基址寄存器,传输数据的起始地址,不能为R15.
2、ARM编译器默认高寄存器优先存入堆栈,即使指令中安排了入栈顺序,编译器也会打乱从新排列。所以入栈时,高寄存器先入。又因为arm为满递减堆栈,所以,入栈后,高寄存器存放在栈中高地址处,低寄存器存放在栈中低地址处。
3、例: STMFD SP!,{R0-R7,LR} 操作如下:
sp = address;
sp = sp-4;
Memory[address] = LR;
for(i=7;i>0;i--)
{
sp = sp-4;
Memory[address] = Ri;
}
例:LDMFD SP!,{R0-R7,PC}^ 操作如下:
address = SP;
for i = 0 to 7
Ri = Memory[address,4]
address = address+4
SP = address;
空堆栈入栈后加(减)4,使SP指向下一个要入栈的地址
满堆栈入栈前减(减)4,使SP指向最后一个入栈的地址
4、其实arm处理器核对堆栈向上向下两种增长方式都支持,但是ADS的C编译器仅支持满递减堆栈,所以我们用的最多的指令时LDMFD/STMFD。
5、数据传输与堆栈操作对应关系
寻址方式 |
说明 |
pop |
=LDM |
push |
=STM |
FA |
递增满 |
LDMFA |
LDMDA |
STMFA |
STMIB |
FD |
递减满 |
LDMFD |
LDMIA |
STMFD |
STMDB |
EA |
递增空 |
LDMEA |
LDMDB |
STMEA |
STMIA |
ED |
递减空 |
LDMED |
LDMIB |
STMED |
STMDA |
阅读(4112) | 评论(0) | 转发(0) |