C语言_函数调用过程(栈帧)
2017-11-14 15:33
267 查看
首先举个栗子:
(6)调用add函数:
(1)参数压栈,形参从右往左依次压入,先b 后a;
(2)现场保护,把调用add函数时main函数运行时的地址压栈;
(3)把ebp压栈;把esp的值赋给ebp,产生add的ebp;
(4)再给esp减去一个十六进制数,产生一个add的esp;
(5)类似上述mian函数的步骤;
调用完成之后释放调用函数的栈帧空间,回到原来环境。
#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函数的步骤;
调用完成之后释放调用函数的栈帧空间,回到原来环境。
相关文章推荐
- 【C语言】函数调用过程解析(栈帧)
- 【C语言】函数运行过程-----栈帧调用
- C语言中函数的调用过程(栈帧)具体解析
- C语言,函数的调用过程(栈帧)
- 函数的调用过程(函数调用栈帧的创建)
- 函数的调用过程,栈帧的创建和销毁
- 函数调用过程(栈帧)的剖析和图解
- c语言函数调用过程原理及函数栈帧分析
- 函数的调用过程(栈帧)
- 浅谈函数的调用过程,栈帧的创建以及销毁
- 谈谈函数的调用过程,栈帧的创建和销毁。
- 深入理解C语言的函数调用过程
- 栈帧与函数调用过程的分析
- MIPS架构上函数调用过程的堆栈和栈帧
- 函数的调用过程(栈帧)
- C语言中函数的调用过程
- 函数调用过程-栈帧 和 进程的关系
- 深入理解C语言的函数调用过程
- 函数的调用过程(栈帧)