浅谈C语言中的函数调用方式-----栈帧结构
2016-11-23 10:42
387 查看
首先,关于栈,在地址空间中栈是向下生长的,也就是说栈底地址是高地址,栈顶地址是底地址。而在CPU中有两个寄存器ebp,esp分别是用来保存栈底地址与栈顶地址的,而ebp又被称为帧指针或基址指针,esp又被称为栈指针。而对于同一个栈而言,栈底是不会变的,也就是说ebp的指向是不会变的,而当有入栈和出栈情况时,只会改变栈顶位置也就是esp的指向。
而对于函数而言,每个函数都有自己独立存在的栈帧结构,但是在一个栈帧结构中必定存在栈顶和栈顶,而它们的地址又要分别保存在esp,ebp中,但在CPU当中只存在一个ebp,一个esp,那么在函数调用过程中必定存在栈帧结构的变化,而栈帧结构的变化又能很明确的说明函数调用过程。
下面来分析一个简单的函数调用:
我们按照程序的实际调试顺序来分析该程序的汇编:
1.首先进入main函数:
2.跳转到fun函数:
3.返回到main函数:
通过对该程序汇编的分析,我们可以得到关于函数调用过程的栈帧结构变化的一张图:
综上我们可以总结出:C语言中函数的调用过程就是旧函数与新函数栈帧结构的形成与恢复过程。
而对于函数而言,每个函数都有自己独立存在的栈帧结构,但是在一个栈帧结构中必定存在栈顶和栈顶,而它们的地址又要分别保存在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语言中函数的调用过程就是旧函数与新函数栈帧结构的形成与恢复过程。
相关文章推荐
- IA32的栈帧结构和函数调用过程
- 函数的调用过程(栈帧结构)—C语言版
- 函数调用时的参数传递和栈帧结构问题
- 函数调用入栈基本步骤(感觉和进程的栈帧结构一块看会比较容易理解)
- 函数调用时的栈帧结构以及临时变量的深入研究
- 函数调用入栈基本步骤(感觉和进程的栈帧结构一块看会比较容易理解)
- 函数调用入栈基本步骤(感觉和进程的栈帧结构一块看会比较容易理解)
- JavaScript实现二级、多级(N级)联动下拉列表框更新版,支持IE6,FireFox,函数和类两种调用方式,支持到N级,非常通用
- 函数调用alv方式总结
- 函数调用方式--__thiscall调用方式和__cdecl,__stdcall有什么区别
- C++中的成员函数调用原理及this指针的传递方式
- CALLBACK, WINAPI, AFXAPI和函数调用方式
- 【代码真相】之 函数调用方式 __cdecl & __stdcall
- javascript 具名函数的四种调用方式 推荐第1/3页
- 用__doPostBack()方法调用后台方法的方式中,页面没有__doPostBack()函数的解决
- .NET工程中以 C 和 C++ 两种方式编译时,函数调用注意事项
- Visual C++中函数调用方式浅探
- 使用C#创建webservice及三种调用方式 (ASP.NETweb编程常用到的27个函数集)
- 函数调用方式的区别[thiscall,__cdecl,__stdcall]
- (转载)函数调用方式比较