文章目录
- 栈的概念
- 使用C语言实现 栈
- 通过代码反汇编解析 栈
栈的概念
所谓的栈就是一块空间的内存,CPU的SP寄存器指向它,它可以用于函数调用,局部变量,多任务系统里保存现场。
使用C语言实现 栈
volatile int num=0;
int fun_b(volatile int a)
{
a = a+2;
return a;
}
int fun_c(volatile int a)
{
a = a+2;
return a;
}
void fun_a(volatile int a)
{
num = fun_b(a);
num = fun_c(num);
}
int main(void)
{
fun_a(99);
return 0;
}
代码中函数调用关系:
main -> fun_a
fun_a -> fun_b
-> fun_c
通过代码反汇编解析 栈
编译代码时,制作反汇编步骤: 在配置中添加命令
fromelf --text -a -c --output=xxx.dis xxx.axf
其中的xxx.axf文件在linker中获取
运行后反汇编文件在工程目录下。查看反汇编代码:
main函数中使用BL命令跳转到fun_a函数(pc=0x80002d0,lr=0x08000308)
fun_a函数中使用BL命令跳转到fun_b函数(pc=0x80002ec,lr=0x080002d8),运行完fun_b函数后,使用BL命令跳转到fun_c函数(pc=0x80002f6,lr=0x080002e2)
在上面的过程中发现lr的值会被覆盖,若被覆盖就会导致找不到之前函数返回的地方。因此在每个函数的第一条反汇编会把lr值保存到栈中(使用push命令),当函数结束的时候使用pop命令回到之前的位置。
整个栈过程如下图所示: