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

首先举个栗子:

#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函数的调用过程 调用完成之后释放调用函数的栈帧空间,回到原来环境。

猜你喜欢

转载自blog.csdn.net/cute_shuai/article/details/78531155