本文主要总结在C编程中调用函数的过程以及栈桢的创建和销毁:
每一次函数调用都是一个过程,这个过程要为函数开辟栈空间,用于本次函数调用中临时变量的保存、现场保护,这块栈空间称之为函数栈桢。栈桢的维护依赖于ebp和esp两个寄存器,ebp是栈底寄存器,存放了维护栈底的指针;esp是栈顶寄存器,存放了维护栈顶的指针,而从栈底到栈顶,地址由低到高。
下面是通过在VC6.0里编程,对函数调用过程的详细解读:
代码如下:
#include <stdio.h>
#include <windows.h>
int myadd(int x, int y)
{
return x+y;
}
int main()
{
int a = 0xAAAAAAAA;
int b = 0xBBBBBBBB;
int c=0;
c = myadd(a, b);
printf("you should run here!\n");
printf("result: %d\n", c);
system("pause");
return 0;
}
第一步形成a、b临时变量,分别将a、b存入exa寄存器,并将其压入mian函数的栈结构中(往栈顶放数据),执行call命令,[注:call命令的功能:将当前正在执行指令的下一条指令的地址压入栈中]:如图1所示:
图1
接下来跳转到myadd,此时EIP变成00401020,进入myadd函数,函数自己形成它的栈桢架构:如图2所示:
图2
最后进行栈桢的销毁及函数值的返回,如图3所示:
(注:函数值返回是以寄存器的形式返回)
图 3
图4为函数调用过程完整示意图:
图4
以上是我对函数调用过程栈桢的创建及销毁过程的理解,理解上有不对的地方希望大家提出宝贵意见!