目录

  • 一、问题:
  • 二、寄存器 栈区
    • 1、寄存器有哪些?有什么作用?
    • 2、编译环境
    • 3、栈区的使用习惯:
    • 4、main函数也是被其他函数调用的
    • 5、汇编代码
  • 三、为main函数创建栈帧
    • 1、main函数之前的函数
    • 2、压栈push
    • 3、为main函数预开辟空间
  • 三、准备abc变量
  • 四、调用Add函数
  • 五、进入函数
  • 六、返回
  • 七、总结:
    • 1、局部变量是怎么创建的:
    • 2、为什么局部变量不初始化是随机值:
    • 3、函数是怎么传参的,传参的顺序是怎样的:
  • 4、形参和实参是什么关系:
    • 5、函数调用结束后是怎么返回的:

一、问题:

  1. 局部变量是怎么创建的:
  2. 为什么局部变量不初始化是随机值:
  3. 函数是怎么传参的,传参的顺序是怎样的:
  4. 形参和实参是什么关系:
  5. 函数调用结束后是怎么返回的:
  6. 返回值如何带回:

二、寄存器 栈区

1、寄存器有哪些?有什么作用?

eax
ebx
ecx
edx
ebp
esp

ebp和esp这2个寄存器中存放的是地址,这两个地址是用来维护函数栈帧的。


2、编译环境

越高级的编译器函数栈帧的封装越不容易看,这里的代码是用VS2013写的

//测试代码
int Add(int x, int y)
{int z = 0;z = x + y;return z;
}int main()
{int a = 10;int b = 20;int c = 0;c = Add(a, b);printf("%d\n", c);return 0;
}

3、栈区的使用习惯:

先使用高地址空间再使用低地址空间,高地址空间使用完再使用低地址的空间。

所以esp称为栈顶指针,ebp称为栈底指针


4、main函数也是被其他函数调用的


5、汇编代码



三、为main函数创建栈帧

1、main函数之前的函数


2、压栈push


3、为main函数预开辟空间



三、准备abc变量



四、调用Add函数



五、进入函数



六、返回



七、总结:

1、局部变量是怎么创建的:

为函数分配好栈帧空间,栈帧空间里初始了部分空间,局部变量在栈帧里分配一些空间

2、为什么局部变量不初始化是随机值:

因为是我们初始化时放进去的,如果不对局部变量进行初始化,就是CCCCCCCC,也就是我们看见的随机值。

3、函数是怎么传参的,传参的顺序是怎样的:

还没有传参的时候,已经push从右向左开始压栈,把两个参数压进去了,

4、形参和实参是什么关系:

形参是我们压栈的时候开辟的空间,形参是实参的一份临时拷贝,他们的空间是独立的,改变形参不会影响实参。

5、函数调用结束后是怎么返回的:

在调用函数之前我们就把call指令的下一条指令压进去了,把ebp调用这个函数的上一个函数的栈帧ebp地址记住了,当我们要返回函数的时候,弹出ebp,就能找到上一个函数调用的ebp,指针往下走的时候,就能够找到esp的顶部,回到栈帧空间。
记住了call指令的下一条指令的地址,返回的时候,就能跳转到call指令的下一条指令的地址,这样就能返回函数。

函数栈帧的创建和销毁图解相关推荐

  1. 函数调用过程详解:函数栈帧的创建与销毁

    前言:我们在学习C语言的过程中,可以会产生很多疑问,比如: 局部变量是怎么创建的 为什么局部变量的值不做初始化就是随机值 函数是怎么传参的?传参的顺序是怎么样的? 形参和实参是什么关系? 函数调用是怎 ...

  2. (动图详解)汇编视角观察函数栈帧的创建和销毁

    目录 ​1.阅读本文的价值 ​2.函数栈帧及栈的概念 ​3.部分寄存器及汇编指令 ​4.main函数的调用 5.main函数的栈帧创建 ​6.变量的栈帧创建 ​6.函数传参 ​7.函数内部运算及销毁 ...

  3. 函数栈帧的创建与销毁

    目录 前言 一.预备知识 1.内存区域的划分和分配 2.栈帧简介 3.寄存器简介 二.函数栈帧介绍 1.源代码 2.如何查看汇编代码 3.函数栈帧的创建与销毁(重点) 三.小彩蛋 总结 前言 最近在学 ...

  4. 程序员内功心法之函数栈帧的创建和销毁

    目录 1.本节目标 2.相关寄存器 3.相关汇编指令 4.什么是函数栈帧 5.什么是调用堆栈 6.函数栈帧的创建和销毁 (1).main函数栈帧的创建与初始化 (2).main函数的核心代码 (3). ...

  5. 【C语言】程序员筑基功法——《函数栈帧的创建与销毁》

    <函数栈帧的创建与销毁> 文章目录 1. 前言 2. 问题引入 3. 前提准备 3.1 寄存器 3.2 汇编指令 4. 函数栈帧的维护 5. 如何调用堆栈 6. 函数栈帧的创建和销毁 6. ...

  6. C语言内功修炼之函数栈帧的创建与销毁(举例加图解)

    大家可能会函数栈帧不了解,可能都没有听过这个,不用着急,在理解函数栈帧之前,我们先来了解一下程序对内存使用的分区大概情况:  区域 作用 栈区(stack) 由编译器自动分配和释放,存放函数的参数值, ...

  7. 程序员内功修炼——函数栈帧的创建与销毁

    一.什么是函数的栈帧 c语言是由函数构成的,那么函数是如何进行传参的?如何调用的?如何返回值的?这些问题与函数的栈帧有关. 函数栈帧:就是函数调用过程中程序的调用栈所开辟的空间,这些空间用来存放: 1 ...

  8. 内功修炼《函数栈帧的创建和销毁》建议收藏

    文章目录 前言 一. 寄存器的概念 二. 通用寄存器的结构 三. 指针寄存器和变址寄存器 四. EBP和ESP 五.总结 前言 在前期的学习过程中,我们可能会有很多的困惑: 1️⃣ 局部变量是怎么创建 ...

  9. 一文带你深入了解函数栈帧的创建和销毁

    作者介绍:友友们好我是沐曦希,可以叫我小沐

最新文章

  1. 手把手教你Android Studio的安装与配置
  2. css -- 两种方法实现流式布局
  3. python变量使用前必须先声明、并且一旦声明_初学者学习Python的30天‍-第18天-文件处理...
  4. linux ssh连接交换机_访问SMB交换机CLI使用SSH或远程登录
  5. Spring Boot整合Redis——自定义RedisSerializer
  6. python3 x和python2 x区别_Python3.x和Python2.x的区别(转存参考)
  7. 做餐饮服务员有前途吗
  8. jmeter 连接 sqlite 进行压力测试
  9. iostream stdlib fstream io.h 头文件的作用
  10. matlab生成正交试验,正交表的构造方法及Matlab实现.pdf
  11. 常用的20个js简洁代码
  12. win10街头篮球服务器维护中,win10系统玩街头篮球游戏延迟不顺畅的处理技巧
  13. 写好作文批语,激发学生的写作兴趣
  14. 使用腾讯tapd工具,进行创建迭代任务、任务拆解、、制定整体发布计划、多维度甘特图进度把控
  15. 路由器桥接:老式路由器桥接隐藏网络并开启无线隐藏网络
  16. EXCEL如何使用查找函数vlookup
  17. 产业分析:股权激励市场实践
  18. 使用左氧氟沙星4注意
  19. butter中文意思_butterfly是什么意思_butterfly的翻译_音标_读音_用法_例句_爱词霸在线词典...
  20. 手机网站常用的推广方式有哪些

热门文章

  1. go mongodb排序查询_Kotlin与MongoDB整合CURD案例详解
  2. eclipse + JBoss 5 + EJB3开发指南(3):使用Session Bean的本地接口
  3. 第二个冲刺期的第四天
  4. jQ判断一个元素是否为空
  5. XPath 获取两个node中间的HTML Nodes
  6. [开源][J2ME]J2ME手机应用程序UI开发框架
  7. CPU使用时间问题测试
  8. python_线程读写操作一
  9. 关于曼哈顿距离和切比雪夫距离的转换和应用
  10. 深入理解line-height