资讯专栏INFORMATION COLUMN

函数栈帧解析

MonoLog / 3339人阅读

摘要:函数栈帧的销毁汇编语言了解函数传参函数返回值如何返回函数中变量如何初始化和赋值函数执行结束后系统进行了什么操作

文章目录


一、什么是函数栈帧

 1.寄存器:

eax, ebx, ecx ...

ebp - 存放了指向函数栈帧栈底的地址
esp - 存放了指向函数栈帧栈顶的地址

2.函数栈帧

函数被调用时,系统会在栈区为该函数开辟一块栈空间,这个栈空间就是该函数的函数栈帧。

以main函数的调用为例

 3.栈帧的作用和维护

        栈帧也叫过程活动记录,是编译器用来实现函数调用过程的一种数据结构。从逻辑上讲,栈帧为一个函数提供了执行环境。

        栈是先用高地址再用低地址,栈帧控制和保存了一个函数所需要的各种信息。

        栈帧的维护离不开ebp和esp寄存器,ebp存放了指向栈帧的栈底地址的指针,esp则存放指向栈顶地址的指针。

 4.栈帧结构

以main函数为例:

 

 

二、函数栈帧的创建

环境为VS2019

​​#includeint 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);	return 0;}​​

1.汇编代码

要研究函数栈帧我们要研究c程序的汇编代码。如图所示:

 

 

 

2.main函数

 


 

 

2.栈帧创建:

 

3.步骤

 

 

 

 

 

main函数的函数栈帧的创建和数据初始化就完成了。

 3.ADD函数栈帧的创建

 add函数栈帧的创建和main函数栈帧创建是一样的,值得注意的是,ADD函数执行结束后的返回值保存在了寄存器eax中,就是避免ADD函数栈帧销毁时,主函数无法访问ADD返回值。由此可见函数返回值是如何返回的。

3.函数栈帧的销毁

1.汇编语言

 4.了解

1.函数传参

 2.函数返回值如何返回

 3.函数中变量如何初始化和赋值

5.函数执行结束后系统进行了什么操作

 

 

 

 

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/119302.html

相关文章

  • 【C语言知识精讲②】函数栈帧的创建和销毁(全程图解)

    摘要:这里分块讲解六函数栈帧的销毁过程一解析的作用是将栈顶的数据弹出,弹出数据储存到相应寄存器中。 ?前言? 读完这篇博客,你可以明白什么? ①局部变量到底是怎么在栈上创建的? ②为什么局部变量不初始化为随机值? ③函数是怎么传参的?传参的先后顺序是什么? ④形参和实参是什么关系? ⑤函数调用是怎...

    davidac 评论0 收藏0
  • 浅析javascript调用栈

    摘要:调用栈是一种栈结构它用来存储计算机程序执行时候其活跃子程序的信息。调用栈是解析器的一种机制。并形成一个栈帧任何被这个函数调用的函数会进一步添加到调用栈中,形成另一个栈帧并且运行到它们被上个程序调用的位置。然后调用栈继续运行其他部门。 大家在进行javascript开发的时候,有没有想过,我们写的代码是怎么样运行的呢?下面我们就来剖析一下代码的执行过程。 一 什么是调用栈 代码在运行过程...

    diabloneo 评论0 收藏0
  • python学习笔记之一(.py文件里输入中文报错)

    摘要:定义默认参数要牢记一点默认参数必须指向不变对象尾递归调用函数本身,但是的返回值不包含表达式。而尾指针相当于把常规的递归反过来,增加一层递归的同时释放前一个递归指针,所以能够始终保持只有一个栈帧在使用中。 教程 1、python大小写敏感 如果字符串里面有很多字符都需要转义,就需要加很多,为了简化,Python还允许用r表示内部的字符串默认不转义 >>> print ...

    heartFollower 评论0 收藏0
  • 【Java系列】从字节码角度深度理解Java函数调用传参方式

    摘要:下文将从字节码的角度,分析中基本类型传参和对象传参。主函数执行时,操作栈会推入主函数栈帧,其中包含了主函数的局部变量表,字节码,返回值等信息。主函数的栈帧会被推入栈,成为当前操作栈。 个人网站地址: http://kailuncen.me/2017/06/0... 一个小问题 在开源中国看到这样一则问题 https://www.oschina.net/quest...,其中的变量a前...

    LdhAndroid 评论0 收藏0
  • java中的栈帧

    摘要:对于执行引擎来说,在活动线程中,只有位于栈顶的栈帧才是最有效的称为当前栈帧与这个栈帧相关联的方法称为当前方法。执行引擎运行的所有的字节码指令都只针对当前栈帧进行操作。 showImg(https://segmentfault.com/img/bVbvueY?w=1600&h=800); 栈帧数据结构 栈帧(Stack Frame)是用来支持虚拟机进行方法调用和方法执行的数据结构,它是虚...

    jeyhan 评论0 收藏0

发表评论

0条评论

MonoLog

|高级讲师

TA的文章

阅读更多
最新活动
阅读需要支付1元查看
<