温馨提示×

温馨提示×

您好,登录后才能下订单哦!

密码登录×
登录注册×
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》

如何进行C语言函数栈帧的创建和销毁分析

发布时间:2021-12-18 09:41:59 来源:亿速云 阅读:124 作者:柒染 栏目:开发技术

如何进行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处于栈底的位置。

如何进行C语言函数栈帧的创建和销毁分析

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

如何进行C语言函数栈帧的创建和销毁分析

如何进行C语言函数栈帧的创建和销毁分析

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

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

如何进行C语言函数栈帧的创建和销毁分析

如何进行C语言函数栈帧的创建和销毁分析

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

 如何进行C语言函数栈帧的创建和销毁分析

结果如图

 如何进行C语言函数栈帧的创建和销毁分析

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

如何进行C语言函数栈帧的创建和销毁分析

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

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

如何进行C语言函数栈帧的创建和销毁分析

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

如何进行C语言函数栈帧的创建和销毁分析

 如何进行C语言函数栈帧的创建和销毁分析

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

如何进行C语言函数栈帧的创建和销毁分析

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

如何进行C语言函数栈帧的创建和销毁分析

 如何进行C语言函数栈帧的创建和销毁分析

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

如何进行C语言函数栈帧的创建和销毁分析

关于如何进行C语言函数栈帧的创建和销毁分析问题的解答就分享到这里了,希望以上内容可以对大家有一定的帮助,如果你还有很多疑惑没有解开,可以关注亿速云行业资讯频道了解更多相关知识。

向AI问一下细节

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

AI