个人技术分享


栈的概念

所谓的栈就是一块空间的内存,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命令回到之前的位置。

整个栈过程如下图所示:
在这里插入图片描述