/*
Cortex M0函数调用在MDK中的堆栈和LR变化演示
本演示程序主要是查看编译器反汇编时,堆栈和LR的变化
仿真时,按F11单步调试,可在寄存器窗口和Watch窗口中查看链接寄存器LR和堆栈指针的变化
在Keil MDK V4.53中汇编后堆栈区根本没有“ARM的栈帧布局图”里的PC、SP、FP内容,只有如下布局:
刚进入main函数时,按以下顺序入栈:
LR
R7
R6
R5
R4
R3
当进入func1函数时,又继续按以下顺序入栈:
LR
R7
R6
R5
R4
R3
当进入func2函数时,再继续按以下顺序入栈:
LR
R6
R5
R4(此时堆栈指针指向这个)
注:有些寄存器用不着保护,也就不用入栈。
当函数返回时,按照入栈的反序依次出栈,将LR出栈到PC,这样就跳转到函数调用处的下一条指令。(LR总是捕获当前执行的BL指令时,ARM正在译指的那条指令的地址)
*/
#include <stdio.h>
int func2(int q1, int q2,int q3,int q4,int q5)
{
int m;
m=q1+q2+q3+q4+q5;
return m;
}
int func1(int p1, int p2, int p3, int p4, int p5)
{
int k;
k=p1+p2+p3+p4+p5;
k=k+func2(3,4,5,6,7);
return k;
}
int main(int argc, char*argv[])
{
int i = 10, j=5;
func1(i, j, 0, 1, 2);
return 0;
}