目录
前言🌀
本文希望能通俗易懂地讲讲函数栈帧的创建与销毁(偏底层的知识)
用VS2019观察到main函数也是被调函数,而调用main函数的函数也被另一个函数调用。
写一个函数,通过一步步调试观察汇编代码,从而探究理解函数相关的内容在栈上的行为过程。
阅读前需要有函数知识基础,诸君若是不嫌弃的话还请移步至此处了解了解函数:
一文带你深入浅出C语言函数
http://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:指令寄存器,保存当前指令的下一条指令的地址

最低0.47元/天 解锁文章
6069

被折叠的 条评论
为什么被折叠?



