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指令把寄存器列表中索引最小