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

C语言_函数调用过程(栈帧)

2017-11-14 15:33 267 查看
首先举个栗子:

#include <stdio,h>

int add(int x,int y)
{
int c=0;
c=x+y
return c;
}

int main()
{
int a=1;
int b=2;
int c=0;
c=add(a,b);
}


在这个程序里,函数被调用才会发挥函数的功能,而函数的调用其实是一个过程,在这个过程计算机要为函数开辟栈空间,用于本次函数临时变量的保存和现场保护,这块空间称为函数的栈帧。现场保护的作用是为了在调用完另一个函数,返回时能回到上一个函数的运行的地方。
在栈帧里,靠ebp和esp维护栈的栈底和栈顶指针。在内存里,变量的保存是从高地址向低地址。
首先main函数其实被__tmainCRTStartup函数调用,而__tmainCRTStartup函数在mainCRTStartup被调用
main函数的调用过程:
(1)首先压栈ebp,方便函数返回后的现场还原,再把esp的值赋给ebp,产生新
的ebp;
(2)再给esp减去一个十六进制数,产生一个新的esp;
(3)依次压栈ebx、esi、edi,然后把edi移到栈顶的有效地址处;
(4)初始化edi到ebp的空间;
(5)以此从高地址处给变量开辟空间;




(6)调用add函数:

(1)参数压栈,形参从右往左依次压入,先b 后a;

(2)现场保护,把调用add函数时main函数运行时的地址压栈;

(3)把ebp压栈;把esp的值赋给ebp,产生add的ebp;

(4)再给esp减去一个十六进制数,产生一个add的esp;

(5)类似上述mian函数的步骤;


调用完成之后释放调用函数的栈帧空间,回到原来环境。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: