一、背景:
1、栈描叙:
栈作为一种数据结构,是一种只能在一端进行插入和删除操作的特殊线性表。它按照先进后出的
原则存储数据,先进入的数据被压入栈底,最后的数据在栈顶,需要读数据的时候从栈顶开始弹出数据
(最后一个数据被第一个读出来)。栈具有记忆作用,对栈的插入与删除操作中,不需要改变栈底指针。
进函数需要压栈操作,保存需要的信息;出函数时需要出栈操作,恢复现场。
2、特殊寄存器:
r0 ~ r3 通常用于传参;
r15 -> pc => 当前程序执行位置;
r14 -> lr => 连接寄存器:跳转指令自动把返回地址放入r14中;
r13 -> sp => 栈指针:指向上一帧的栈底;
r12 -> ip => ip 内部过程调用寄存器Intra-Procedure-call scratch register,其实就是r12;
r11 -> fp => 当前函数栈帧的栈底,也就是栈基地址FP;
BL NEXT ;跳转到子程序NEXT处执行
......... ;
NEXT
..........
MOV PC,LR ;从子程序返回,
这里的BL是跳转的意思,LR(R14)保存了返回地址
PC(R15)是当前地址,把LR给PC就是从子程序返回
二、调用过程:
下图描述的是ARM的栈帧布局方式,main stack frame为调用函数的栈帧,func1 stack frame为
当前函数(被调用者)的栈帧,栈底在高地址,栈向下增长。图中FP就