函数调用的过程
2012-04-12 09:43
197 查看
(2006-04-28 16:06)
标签: - 分类: c++
调用函数时使用栈空间保存各类信息。其过程大致如下:
①保存调用函数(function caller)的程序的运行状态和返回地址,将其压入栈内。
②将函数实参(引用除外)复制为副本(copy)后压入栈内,以便顶替形参来参加函数的运行。同时将各寄存器内容压入栈内。
③执行被调用函数的函数体内的语句。
④如有返回值,将该返回值(引用除外)复制为副本并压入栈内。接着传递给调用函数的程序。
⑤将各寄存器内容弹出栈,恢复调用函数的程序的运行状态,从而释放被占栈空间。
⑥按照返回地址将控制权交还给调用函数。 可见,调用函数时将增加时间开销和小量空间开销。
——————————————————————————————————————————
一、函数调用的基本步骤
函数调用大致包括以下几个步骤。
(1)参数入栈:将参数从右向左依次压入系统栈中。
(2)返回地址入栈:将当前代码区调用指令的下一条指令地址压入栈中,供函数返回时继续执行。
(3)代码区跳转:处理器从当前代码区跳转到被调用函数的入口处。
(4)栈帧调整:具体包括:
保存当前栈帧状态值,已备后面恢复本栈帧时使用(EBP入栈)。
将当前栈帧切换到新栈帧(将ESP值装入EBP,更新栈帧底部)。
给新栈帧分配空间(把ESP减去所需空间的大小,抬高栈顶)。
标签: - 分类: c++
调用函数时使用栈空间保存各类信息。其过程大致如下:
①保存调用函数(function caller)的程序的运行状态和返回地址,将其压入栈内。
②将函数实参(引用除外)复制为副本(copy)后压入栈内,以便顶替形参来参加函数的运行。同时将各寄存器内容压入栈内。
③执行被调用函数的函数体内的语句。
④如有返回值,将该返回值(引用除外)复制为副本并压入栈内。接着传递给调用函数的程序。
⑤将各寄存器内容弹出栈,恢复调用函数的程序的运行状态,从而释放被占栈空间。
⑥按照返回地址将控制权交还给调用函数。 可见,调用函数时将增加时间开销和小量空间开销。
——————————————————————————————————————————
一、函数调用的基本步骤
函数调用大致包括以下几个步骤。
(1)参数入栈:将参数从右向左依次压入系统栈中。
(2)返回地址入栈:将当前代码区调用指令的下一条指令地址压入栈中,供函数返回时继续执行。
(3)代码区跳转:处理器从当前代码区跳转到被调用函数的入口处。
(4)栈帧调整:具体包括:
保存当前栈帧状态值,已备后面恢复本栈帧时使用(EBP入栈)。
将当前栈帧切换到新栈帧(将ESP值装入EBP,更新栈帧底部)。
给新栈帧分配空间(把ESP减去所需空间的大小,抬高栈顶)。
相关文章推荐
- C进程的Memory Layout&linux进程的地址空间&函数调用过程
- 函数调用过程探究
- 函数调用过程(详解)
- 条款9:绝不在构造和析构过程中调用virtual函数
- 堆栈、栈帧与函数调用过程分析
- 进程、过程调用、函数调用、堆、栈
- sigaction()函数的调用以及在调用过程中,未决集和阻塞集的变化情况
- .prg文件中自定义了一些过程和函数'该怎么调用?
- javascript 的函数调用过程中的arguments,callee,caller,apply,call
- Java-数据库操作 过程proc、函数func调用
- 函数调用过程探究
- 深入探索c/c++函数(2)---普通成员函数调用的基本过程
- 函数的调用在底层的过程
- MATLAB调用OpenCV2.4库函数的全过程及问题解决
- Mybatis调用存储过程和函数
- 调用oracle函数与存储过程
- 谈谈函数的调用过程,栈帧的创建和销毁。
- c函数调用过程原理及函数栈帧分析
- 分析fork函数对应的系统调用处理过程
- 从一个新手容易混淆的例子简单分析C语言中函数调用过程