广告
返回顶部
首页 > 资讯 > 后端开发 > 其他教程 >C语言函数栈帧的创建和销毁介绍
  • 704
分享到

C语言函数栈帧的创建和销毁介绍

2024-04-02 19:04:59 704人浏览 薄情痞子
摘要

在初学C语言中,很多时候要记的内容有点多,有时候并不能深入的了解它。关于函数的栈帧可以帮助我们深入了解函数传参的过程,让我们了解c语言。 以下是我们平时接触过,但不了解的问题: 1

在初学C语言中,很多时候要记的内容有点多,有时候并不能深入的了解它。关于函数的栈帧可以帮助我们深入了解函数传参的过程,让我们了解c语言。

以下是我们平时接触过,但不了解的问题:

1.为什么局部变量在未赋值前是随机的。

2.局部变量创建的过程。

3.函数传参,传参的顺序问题、

4.形参与实参的关系什么。

5.调用函数是怎么调用的,调用的过程是什么。

6.调用函数结束后,是怎样返回的。

这些问题我们在学校可能并不会接触,也不会出现在考试的试卷上,但是作为计算机专业的学生,做一些认识和了解是很有必要的。这就相当于我们的内功,在以后深入学习时,就能够更快的理解和认识。下面就是函数调用的整个过程,学习完之后,对以上的问题就有一个答案了。

函数栈帧就是系统分配给函数的空间,存放的是地址。

而esp ebp,作用是来维护函数栈帧。

esp ebp跟eax ebx ecx edx一样,就是系统的寄存器,有一定的存储功能。

下面就以这个函数为例


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;
}

main函数和其他函数一样,main函数也是被调用的函数。

其基本逻辑是mainCRTStartup调用_tmainCRTStartup调用main函数

 程序运行时,ebp与ebp维护_tmainCRTStartup,起初esp处在栈顶指针的位置,而ebp处于栈底的位置。

 首先push,继续压栈操作,把ebp的地址打印到esp的位置上 ,再把esp的值代到ebp中,esp再加上oE4h的内存编号,就形成了下图情况。

 此时ebp与esp就来维护main函数,在进行三次push压栈,将ebx,esi,edi,压到栈顶。其目的是让系统正常的运行。

接下来接是lev mov mov的操作,就让esp与ebp之间的空间的内容全部变为cccccc,这就是在变量未定义前,其值都是随机值的原因。

 接下来就要定义变量abc了,那系统是怎样在栈区,给abc留有空间来定义的了?就是以下三步来实现的~这就为abc分配了空间。

 

结果如图

 

当abc定义后,接下来就是函数调用,函数传参的过程。

 系统是先将ab的值分别放在eax ecx的寄存器中。

下面这个操作跟main函数开辟空间是类似的。

下面蓝色部分,是函数的传参过程,由图易知。 函数传参实际上只是将ab的值保存在寄存器中,在临时拷贝给x和y。

 

此时ebp-8的位置就是z所在的空间,再储存再寄存器中。

 然后再将edi esi ebx弹出,ebp的地址传给esp,再将ebp弹出,ebp与esp回到原来的位置,重新来维护main函数。

 

把储存在寄存器中z的值传给c

整个过程就是  函数栈帧的创建和销毁。说到这些,前面所提的问题就有了一定的答案,可能我认识的只是其中的一部分,但我相信在以后,会了解更多,了解更深人,在此进行讲述出来,这也算是我的目标吧。

到此这篇关于C语言函数栈帧的创建和销毁介绍的文章就介绍到这了,更多相关C语言函数栈帧的创建和销毁内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

--结束END--

本文标题: C语言函数栈帧的创建和销毁介绍

本文链接: https://www.lsjlt.com/news/160203.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • C语言函数栈帧的创建和销毁介绍
    在初学c语言中,很多时候要记的内容有点多,有时候并不能深入的了解它。关于函数的栈帧可以帮助我们深入了解函数传参的过程,让我们了解c语言。 以下是我们平时接触过,但不了解的问题: 1...
    99+
    2022-11-12
  • C语言函数栈帧如何创建和销毁
    这篇文章主要为大家展示了“C语言函数栈帧如何创建和销毁”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“C语言函数栈帧如何创建和销毁”这篇文章吧。写在前面我们知道,每一次函数调用都需要在栈区上为其开...
    99+
    2023-06-29
  • C语言函数栈帧的创建和销毁详解
    目录写在前面Add函数的调用函数传参Add函数栈帧的创建Add函数栈帧的销毁main函数栈帧的销毁总结写在前面 我们知道,每一次函数调用都需要在栈区上为其开辟一块空间,这块空间就叫做...
    99+
    2022-11-13
  • C语言函数栈帧的创建与销毁详解
    目录前言一、函数栈帧是什么?1.寄存器2.ebp与esp二、函数栈帧的创建1.代码块2.调用堆栈3.esp与ebp如何维护栈帧总结 前言 大家在学习的时候一定有以下困惑: ...
    99+
    2022-11-13
  • c语言函数栈帧的创建和销毁过程详解
    目录1 相关知识介绍 1.1 寄存器1.2 函数栈帧概述2 栈帧创建与销毁过程1 相关知识介绍  1.1 寄存器 一般计算机内通用寄存器包括eax,ebx,ec...
    99+
    2022-11-12
  • C语言超详细讲解函数栈帧的创建和销毁
    目录1、本节目标2、相关寄存器3、相关汇编指令4、什么是函数栈帧5、什么是调用堆栈6、函数栈帧的创建和销毁(1)、main函数栈帧的创建与初始化(2)、main函数的核心代码(3)、...
    99+
    2022-11-13
  • C语言函数栈帧的创建与销毁原理图解
    目录什么是函数栈帧什么是栈?与函数栈帧有关的汇编语句函数如何创建栈帧并销毁main函数栈帧开辟调用Add函数返回主函数什么是函数栈帧 我们在写C语言代码的时候,经常会把一个独立的功能...
    99+
    2022-11-13
  • C语言中函数栈帧的创建和销毁的深层分析
    目录一、本文目标二、基础知识1、寄存器2、代码案例  3、总体栈帧概况4、所需反汇编代码总览三、函数栈帧创建销毁过程1、_tmainCRTStartup函数(调用main函...
    99+
    2022-11-13
  • 如何进行C语言函数栈帧的创建和销毁分析
    如何进行C语言函数栈帧的创建和销毁分析,针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。以下是我们平时接触过,但不了解的问题:1.为什么局部变量在未赋值前是随机的。2.局部变量...
    99+
    2023-06-22
  • C语言详尽图解函数栈帧的创建和销毁实现
    目录常见寄存器基本的汇编语言知识具体实现关于栈帧创建与销毁的问答题注:本文章所使用的编译器是VS2010,由于不同编译器的函数栈帧与销毁略有差异,所以具体细节请读者自行实践! 常见寄...
    99+
    2022-11-13
  • C语言堆栈帧的介绍与创建
    什么是堆栈帧?        堆栈帧(stack frame)是一块堆栈保留区域,用于存放被传递的实际参数,子程序的返回...
    99+
    2022-11-12
  • C语言堆栈帧的介绍与创建方式
    本篇内容主要讲解“C语言堆栈帧的介绍与创建方式”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“C语言堆栈帧的介绍与创建方式”吧!什么是堆栈帧?    &nb...
    99+
    2023-06-20
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作