在初学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语言函数栈帧的创建和销毁介绍的文章就介绍tvb经典台词到这了,更多相关c语言函数栈帧的创建和销毁内容请搜索www.887551.com以前的文章或继续浏览下面的相关文章希望大家以后多多支持www.887551.com!
本文发布于:2023-04-04 03:44:38,感谢您对本站的认可!
本文链接:https://www.wtabcd.cn/fanwen/zuowen/52df0e0f2cf6c6103a9afc2f5264dd7a.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文word下载地址:C语言函数栈帧的创建和销毁介绍.doc
本文 PDF 下载地址:C语言函数栈帧的创建和销毁介绍.pdf
留言与评论(共有 0 条评论) |