您的位置:首页 > 编程语言 > C语言/C++

浅谈C语言中的函数调用方式-----栈帧结构

2016-11-23 10:42 387 查看
    首先,关于栈,在地址空间中栈是向下生长的,也就是说栈底地址是高地址,栈顶地址是底地址。而在CPU中有两个寄存器ebp,esp分别是用来保存栈底地址与栈顶地址的,而ebp又被称为帧指针或基址指针,esp又被称为栈指针。而对于同一个栈而言,栈底是不会变的,也就是说ebp的指向是不会变的,而当有入栈和出栈情况时,只会改变栈顶位置也就是esp的指向。

   而对于函数而言,每个函数都有自己独立存在的栈帧结构,但是在一个栈帧结构中必定存在栈顶和栈顶,而它们的地址又要分别保存在esp,ebp中,但在CPU当中只存在一个ebp,一个esp,那么在函数调用过程中必定存在栈帧结构的变化,而栈帧结构的变化又能很明确的说明函数调用过程。

   下面来分析一个简单的函数调用:

#include <stdio.h>
#include <windows.h>
int fun(int x,int y)
{
int c=0xcccccccc;
return c;

}
int main()
{
int a=0xaaaaaaaa;
int b=0xbbbbbbbb;
int ret=fun(a,b);
system("pause");
return 0;
}
对于上面这个程序,很简单只是main函数调用了fun函数,下面我们通过这个程序的汇编代码来分析这个程序中函数的调用过程:
我们按照程序的实际调试顺序来分析该程序的汇编:

1.首先进入main函数:



2.跳转到fun函数:



3.返回到main函数:



通过对该程序汇编的分析,我们可以得到关于函数调用过程的栈帧结构变化的一张图:



综上我们可以总结出:C语言中函数的调用过程就是旧函数与新函数栈帧结构的形成与恢复过程。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: