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

来源:互联网 发布:使用ajax前台显示数据 编辑:程序博客网 时间:2024/06/08 07:36

首先举个栗子:

#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)以此从高地址处给变量开辟空间;

main函数调用过程
(6)调用add函数:
(1)参数压栈,形参从右往左依次压入,先b 后a;
(2)现场保护,把调用add函数时main函数运行时的地址压栈;
(3)把ebp压栈;把esp的值赋给ebp,产生add的ebp;
(4)再给esp减去一个十六进制数,产生一个add的esp;
(5)类似上述mian函数的步骤;
add函数的调用过程 调用完成之后释放调用函数的栈帧空间,回到原来环境。