【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,同时一个一个的把数据从高地址向低地址压入

【ARM汇编】stmfd sp!, {r0-r3, lr}_第1张图片

                    图 2

参考网址来源:https://blog.csdn.net/yxnyxnyxnyxnyxn/article/details/18302887

你可能感兴趣的:(ARM,汇编指令)