【ARM汇编】stmfd sp!, {r0-r3, lr}
stmfd sp!, {r0-r3, lr} 【属于8中寻址方式中的“堆栈寻址”】
上面这句ARM汇编指令的伪代码如下
//SP指针地址变化过程
SP = SP - 4×4; //4个寄存器,每个4个字节,该语句得到运算后的SP地址
address = SP; //将运算后的地址赋给临时地址变量address
//寄存器赋值给内存地址的赋值过程
for i = 0 to 2
Memory[address] = ri; //将r0、r1、r2赋给内存有小到大的地址
address = address + 4; //地址添加4后,将lr赋给最高的地址
Memory[address] = lr;
SP栈指针指向的变化
图 1
图1中,左图是执行指令stmfd sp!, {r0-r3, lr}前,右图是执行stmfd sp!, {r0-r3, lr}指令之后,观察SP地址变化情况。
【注意】1、ARM规定,sp始终是指向栈顶位置的,stm指令把寄存器列表中索引最小的寄存器存在最低地址,所以R0在最低地址,向上依次是r1,r2,r3,lr。完成后SP指向保存r0的地址。
【详解】对于大多数的设计来说都是把栈底设置在高地址,栈顶设置在低地址,如图2所示。
即是说上面所说的首先要sp=sp-4×4,这里理解了之后就好理解了,那么执行这条指令后,栈中的数据顺序从栈底到栈顶为lr ,r3,r2,r1,r0,此时sp-->r0,即栈顶,这和堆栈的定义没有冲突,如果sp指向的是lr的话栈就没有用了哦。
【stmfd指令的两种处理方法】
第一种:先计算总共压入的数据个数,直接一次更改指针sp=sp-4*(number)并从低地址向高地址存入数据。
第二种:每压入一次就把sp=sp-1*4,同时一个一个的把数据从高地址向低地址压入
图 2
参考网址来源:https://blog.****.net/yxnyxnyxnyxnyxn/article/details/18302887