一文带你深入浅出函数栈帧

目录

前言🌀

1. 什么是函数栈帧🌀

2. 函数栈帧的创建和销毁解析🌀

2.1 什么是栈?🌀

2.2 认识相关寄存器和汇编指令🌀

2.3 解析函数栈帧的创建和销毁🌀

2.3.1 预备知识🌀

看看入栈:🌀

再看看出栈:🌀

2.3.2main函数与Add函数🌀

准备环境🌀

转到反汇编🌀

小知识:烫烫烫~

拓展了解:🌀

Add函数调用的总结:🌀

个人总结:🌀

3.开篇问题解答🌀

感谢观看,敬请期待更好的作品吧。🌀


前言🌀

本文希望能通俗易懂地讲讲函数栈帧的创建与销毁(偏底层的知识)

        用VS2019观察到main函数也是被调函数,而调用main函数的函数也被另一个函数调用。

        写一个函数,通过一步步调试观察汇编代码,从而探究理解函数相关的内容在栈上的行为过程。

        阅读前需要有函数知识基础,诸君若是不嫌弃的话还请移步至此处了解了解函数:

一文带你深入浅出C语言函数icon-default.png?t=M5H6http://t.csdn.cn/uTgM2

开始前,有几个问题,看看你能答出几个。

1.什么是函数栈帧?

2.函数是如何调用的?

3.函数调用时参数时如何传递的?传参的顺序是怎样的?

4.函数的形参和实参分别是怎样实例化的?(实例化一个对象就是为对象开辟内存空间)

5.形参和实参又是什么样的关系呢?

6.函数的返回值又是如何返回的?

7.局部变量是如何创建的?

8.为什么局部变量若不初始化,内容是随机的?

        如果毫无压力秒答的话请大佬高抬贵脚移步他处,莫要在我这浪费时间了。

        要是答不出几个来的话,这篇文章你应该读一读,接触一下偏底层的知识,深入了解函数栈帧知识,修炼一下自己的编程内功。

        让我们一起走进函数栈帧的创建和销毁的过程中吧。

1. 什么是函数栈帧🌀

        我们在写C语言代码的时候,经常会把一个独立的功能抽象为函数,所以C程序是以函数为基本单位的。

        函数栈帧(stack frame)就是函数调用过程中在程序的调用栈(call stack)所开辟的空间,(函数栈帧放在栈区上),这些空间是用来存放:

1.函数参数和函数返回值

2.临时变量(包括函数的非静态的局部变量以及编译器自动生产的其他临时变量)

3.保存上下文信息(包括在函数调用前后需要保持不变的寄存器)。

内存分区简化图:

2. 函数栈帧的创建和销毁解析🌀

2.1 什么是栈?🌀

        栈(stack)是现代计算机程序里最为重要的概念之一,几乎每一个程序都使用了栈,没有栈就没有函数,没有局部变量,也就没有我们如今看到的所有的计算机语言。

        在经典的计算机科学中,栈被定义为一种特殊的容器,是一种数据结构,用户可以将数据压入栈中(入栈push),也可以将已经压入栈中的数据弹出(出栈,pop),但是栈这个容器必须遵守一条规则:先入栈的数据后出栈(First In Last Out, FILO)。

        是一种单通道的容器,只有栈顶一个出入口,就像叠成一叠的书,先叠上去的书在最下面,要先把上面的书取完,要最后才能取出最先叠上的书。

        而在计算机系统中,栈则是一个具有以上属性的动态内存区域。程序可以将数据压入栈中,也可以将数据从栈顶弹出。压栈操作使得栈增大,而弹出操作使得栈减小。

        在经典的操作系统中,栈总是向下增长(上面低地址下面高地址)的。

        在我们常见的i386或者x86-64下,栈顶由称为 esp 的寄存器进行定位的。

2.2 认识相关寄存器和汇编指令🌀

(寄存器不属于内存,而是单独的存储空间)

相关寄存器

eax:通用寄存器,保留临时数据,常用于返回值

ebx:通用寄存器,保留临时数据

ebp:栈底寄存器

esp:栈顶寄存器

eip:指令寄存器,保存当前指令的下一条指令的地址

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

桦秋静

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值