C语言-------函数栈帧的创建和销毁------剖析描骨

这篇具有很好参考价值的文章主要介绍了C语言-------函数栈帧的创建和销毁------剖析描骨。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

作者前言

🎂        ✨✨✨✨✨✨🍧🍧🍧🍧🍧🍧🍧🎂

   🎂      作者介绍:                              🎂🎂

       🎂 🎉🎉🎉🎉🎉🎉🎉              🎂

          🎂作者id:老秦包你会,         🎂

简单介绍:🎂🎂🎂🎂🎂🎂🎂🎂🎂🎂🎂🎂🎂🎂🎂

             喜欢学习C语言和python等编程语言,是一位爱分享的博主,有兴趣的小可爱可以来互讨         🎂🎂🎂🎂🎂🎂🎂🎂

                 🎂个人主页::小小页面🎂

                  🎂gitee页面:秦大大🎂

                   🎂🎂🎂🎂🎂🎂🎂🎂
        🎂  一个爱分享的小博主 欢迎小可爱们前来借鉴🎂

_______________________________________________________

______________________________________________________________________

目录

——————————————————————————————————————

知识的简单介绍

寄存器(是集成于cpu,不在内存上)

eax、ebx、ecx、edx、ebp、esp

其中ebp、esp这两个寄存器中存放的是地址,是来维护函数栈帧

每一个函数调用,都需要在栈区创建一个空间
int add(int a, int b)
{
	int z = 0;
	z = a + b;
	return z;
}
int main()
{
	int a = 10;
	int b = 20;
	int c = 0;
	c = add(a, b);
	printf("%d", c);


	return 0;
}

C语言-------函数栈帧的创建和销毁------剖析描骨,开发语言,c语言

esp 和edp存放的是函数的栈帧的,哪个函数调用,这两个寄存器就会跑到那里去,

栈区申请空间的习惯是:先使用高地址,再使用低地址,所以ebp又称栈低地址,esp称栈顶指针

当我们进一步调试的时候使用调用栈堆观察就会发现main函数会被其他函数调用

C语言-------函数栈帧的创建和销毁------剖析描骨,开发语言,c语言

 当我们使用反汇谝查看就会有

C语言-------函数栈帧的创建和销毁------剖析描骨,开发语言,c语言

 这是啥原因呢?

原因是调用main函数的函数正在使用ebp和esp,当调用到

main函数的时候esp就会变动,指向main函数的地址 

C语言-------函数栈帧的创建和销毁------剖析描骨,开发语言,c语言

C语言-------函数栈帧的创建和销毁------剖析描骨,开发语言,c语言

 push  ebp就是在栈区申请一块空间存放ebp的值,这个值是是invoke_main()栈低地址的值,字节大小为4个字节

 当调用了main()函数并创建了申请ebp空间,esp就会指向ebp空间的栈顶地址,运行下一步,然后把esp的值给ebp里面,ebp就指向ebp空间的栈顶地址,运行下一步,然后esp -0E4h得到main函数的栈顶地址,并指向他

, 

C语言-------函数栈帧的创建和销毁------剖析描骨,开发语言,c语言每次(push  名字  )esp会自动指向这块空间的栈顶地址,会开辟一块地址存储push过的值

C语言-------函数栈帧的创建和销毁------剖析描骨,开发语言,c语言

在反汇谝中

C语言-------函数栈帧的创建和销毁------剖析描骨,开发语言,c语言

 edi存放ebp-24h的值,也就是为main函数开辟的开头地址

word代表两个字节, dword代表四个字节,

意思就是从edi开始,给ecx个(9个)四个字节全部改为0CCCCCCC, 结束点是ebp指向的地址

C语言-------函数栈帧的创建和销毁------剖析描骨,开发语言,c语言

压栈 :往栈里面开辟一块空间存放值

出栈:从栈删除这块空间

C语言-------函数栈帧的创建和销毁------剖析描骨,开发语言,c语言

C语言-------函数栈帧的创建和销毁------剖析描骨,开发语言,c语言

 往ebp-8的地址存放10.ebp-14h存放14h

C语言-------函数栈帧的创建和销毁------剖析描骨,开发语言,c语言

 C语言-------函数栈帧的创建和销毁------剖析描骨,开发语言,c语言

接下来遇见 push eax 就会压栈,

C语言-------函数栈帧的创建和销毁------剖析描骨,开发语言,c语言

 运行到call ( 调用的意思) 并压栈了一个,里面存放call下一条指令的地址

C语言-------函数栈帧的创建和销毁------剖析描骨,开发语言,c语言C语言-------函数栈帧的创建和销毁------剖析描骨,开发语言,c语言

 C语言-------函数栈帧的创建和销毁------剖析描骨,开发语言,c语言

 C语言-------函数栈帧的创建和销毁------剖析描骨,开发语言,c语言

接下来我们就会进入到add函数里面去了 ,申请ebp空间,esp指向ebp空间的栈顶地址,赋予给ebp,然后esp减去0CCh,申请ebx、esi、edi,最终esp指向edi的栈顶地址,把ebp-0Ch赋值给edi ,从edi开始的三个4个字节的内容改为0CCCCCCCC

最后当返回时

C语言-------函数栈帧的创建和销毁------剖析描骨,开发语言,c语言

 pop 就是出栈的意思, 当我们pop掉该函数ebp空间并把结果返回给ebp,edp就会指向上一个函数,原因是一个函数的ebp空间没有pop掉

ret返回,怎么返回呢?

C语言-------函数栈帧的创建和销毁------剖析描骨,开发语言,c语言

 在红色框里面存放了上一个函数的call下一条指令的地址,ret就是返回到这里去

总结:

一个函数的创建先要创建好一块栈帧,esp和ebp进行维护,和函数的调用并返回是在一块栈帧上存储了调用该函数的函数call的下一条指令的地址,函数的形参传值是找到实参的值进行传值,文章来源地址https://www.toymoban.com/news/detail-623490.html

到了这里,关于C语言-------函数栈帧的创建和销毁------剖析描骨的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • C语言之反汇编查看函数栈帧的创建与销毁

    函数栈帧是用于在计算机程序中实现函数调用的一种数据结构。在函数调用过程中,每个函数都需要在内存中创建一个栈帧,用于存储局部变量、返回地址和参数等。 具体来说,函数栈帧通常包含以下部分: 局部变量表:存储函数的局部变量,包括基本数据类型(如整数、

    2024年01月23日
    浏览(30)
  • 【C语言__函数栈帧的创建和销毁__复习篇9】

    目录 前言 一、知识补充 二、分析创建和销毁的过程 三、前言问题回答 本篇主要讨论以下问题: 1. 编译器什么时候为局部变量分配的空间 2. 为什么局部变量的值是随机的 3. 函数是怎么传参的,传参的顺序是怎样的 4. 形参和实参是什么关系 5. 函数调用是怎么做的 6. 函数调

    2024年04月25日
    浏览(28)
  • 打通你学习C语言的任督二脉-函数栈帧的创建和销毁(上)

      🌈个人主页:  Aileen_0v0 🔥系列专栏: C语言学习 💫个人格言: \\\"没有罗马,那就自己创造罗马~\\\" 待解决疑惑: 局部变量是怎么创建的? 为什么局部变量的值是随机值? 函数是怎么传参的?传参的顺序是怎样的? 形参和实参是什么关系? 函数调用是怎么做的? 函数调用是结束后怎么返

    2024年02月05日
    浏览(26)
  • 函数栈帧的创建和销毁

    前言 观察函数栈帧的创建和销毁,不要使用太高级别的的编译器,越高级的编译器越不容易学习和观察。同时在不同编译器下,函数调用的过程中栈帧的创建是略有差异的,具体细节取决于编译器的实现 我们在写C语言代码的时候,经常会把一个独立的功能抽象为函数,所以

    2023年04月17日
    浏览(35)
  • 函数栈帧的创建与销毁

    魔王的介绍:😶‍🌫️一名双非本科大一小白。 魔王的目标:🤯努力赶上周围卷王的脚步。 魔王的主页:🔥🔥🔥大魔王.🔥🔥🔥 ❤️‍🔥大魔王与你分享:莫泊桑说过,生活可能不像你想象的那么好,但是也不会像你想象的那么糟。人的脆弱和坚强都超乎了自己的想

    2024年02月15日
    浏览(29)
  • 从汇编代码探究函数栈帧的创建和销毁的底层原理

    人,只有在放弃战斗的时候才算输,只要坚持战斗,就还没输  本文收录于青花雾气-计算机基础 往期回顾 从0到1搞定在线OJ 数据在内存中的存储 计算机存储的大小端模式 目录 一、先导知识 二、函数调用堆栈 三、函数栈帧的创建 1.创建函数栈帧 2.创建变量 3.函数传参 4.函数

    2024年02月08日
    浏览(27)
  • 【C语言】函数栈帧的创建和毁销

    大家好,我是深鱼~ 目录 一、寄存器 二、栈区  三、函数栈帧的创建 1.为main函数开辟栈帧  2.在main函数中创建变量 3.调用Add函数前的准备  4.为Add函数开辟栈帧  5.在Add函数中创建变量并运算 四、函数栈帧的销毁 6.Add函数栈帧的销毁 7.返回main函数栈帧 【前言】 前期学习的时

    2024年02月14日
    浏览(26)
  • 函数栈帧的创建和毁销【C语言版】

    大家好,我是深鱼~ 目录 一、寄存器 二、栈区  三、函数栈帧的创建 1.为main函数开辟栈帧  2.在main函数中创建变量 3.调用Add函数前的准备  4.为Add函数开辟栈帧  5.在Add函数中创建变量并运算 四、函数栈帧的销毁 6.Add函数栈帧的销毁 7.返回main函数栈帧 【前言】 前期学习的时

    2024年02月15日
    浏览(30)
  • 探秘函数栈帧:『 揭开函数栈帧创建与销毁的神秘面纱 』

    .. 目录 知识点回顾 一、什么是栈帧(堆栈帧)? 1.内存布局 2.常用寄存器 3.汇编指令 👇👇对于栈的详细介绍 : 👇👇函数栈帧的介绍: 二、函数调用中的栈帧 1.探究main函数栈帧的创建 2.对main函数中的代码进行分析 3.探究Add函数栈帧的创建  三、函数栈帧的销毁过程 博客引

    2024年02月06日
    浏览(36)
  • 学C的第十一天【查看汇编代码一步步了解 函数栈帧(栈区局部变量)的创建和销毁】

    ========================================================================= 相关代码gitee自取: C语言学习日记: 加油努力 (gitee.com) ========================================================================= 接上期: 学C的第十天(继续深入学习函数、函数递归、练习)-CSDN博客 ============================================

    2024年02月04日
    浏览(29)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包