本文主要总结在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;
}

第一步形成ab临时变量,分别将ab存入exa寄存器,并将其压入mian函数的栈结构中(往栈顶放数据),执行call命令,[注:call命令的功能:将当前正在执行指令的下一条指令的地址压入栈中]1所示:

总结函数的调用过程

总结函数的调用过程

总结函数的调用过程

图1

总结函数的调用过程

 总结函数的调用过程

接下来跳转到myadd,此时EIP变成00401020,进入myadd函数,函数自己形成它的栈桢架构:如图2所示:

总结函数的调用过程 

总结函数的调用过程

总结函数的调用过程

总结函数的调用过程

总结函数的调用过程

图2

最后进行栈桢的销毁及函数值的返回,如图3所示

(注:函数值返回是以寄存器的形式返回)

总结函数的调用过程

总结函数的调用过程

图 3

图4为函数调用过程完整示意图:

总结函数的调用过程

总结函数的调用过程

图4 

    以上是我对函数调用过程栈桢的创建及销毁过程的理解,理解上有不对的地方希望大家提出宝贵意见!


 

相关文章:

  • 2021-08-05
  • 2021-10-25
  • 2022-02-26
  • 2022-12-23
  • 2021-08-10
  • 2021-05-16
  • 2021-06-05
  • 2021-05-03
猜你喜欢
  • 2021-09-08
  • 2021-10-11
  • 2022-12-23
  • 2022-12-23
  • 2021-04-24
  • 2022-12-23
  • 2021-07-12
相关资源
相似解决方案