函数调用时,系统底层做了什么?
2017-02-26 15:31
295 查看
一
去年面试的时候,曾经被问到过这样的问题:“你对汇编了解吗?那么调用一个C函数时系统底层做了什么?”我仔细回想上课学到的内容,发现已经忘光了,重新去翻了翻《深入理解计算机系统》这本书,得到了解答。在此记下给自己加深印象。
二
首先要回想的是一些基础概念:栈帧(stack frame):机器用栈来传递过程参数与返回信息,为单个过程分配的那部分栈称为它的栈帧。
%ebp:寄存器,在IA32模型中相对esp更靠近栈底,称为帧指针
%esp:同上,指向栈的顶部,称为栈指针
返回地址:指的是从函数返回后,所指向的要继续运行的代码
push x : 此操作指的是将栈顶指针%esp的值减4,并把x存入当前%esp位置。
三
假设过程P(调用者)调用过程Q(被调用者),则将调用参数从后往前的压入P的栈桢中,最后压入一个返回地址作为P的栈桢的末尾。Q栈帧开头会push %ebp一次,把旧的ebp值(P栈桢的尾部)记录下来,以便之后退出时可以回调用之前的%ebp。并
movl %esp, %ebp使得此时%esp=%ebp,同时指向栈顶位置,于是Q的栈帧就这样可以开始使用了。
描述出来过于抽象,具体如图所示:
相关文章推荐
- c语言里面的调用显示系统时间的函数及实现过程是什么
- 系统调用与函数的区别
- 函数调用方式--__thiscall调用方式和__cdecl,__stdcall有什么区别
- c#中委托和直接函数调用用什么区别,好处和目的在哪?
- 函数调用方式--__thiscall调用方式和__cdecl,__stdcall有什么区别
- Linux系统调用--uname函数详解
- 中科院ICTCLAS系统,ICTCLAS.dll的函数调用示例(C语言)
- 什么时间调用 UpdateData() --MFC函数
- C语言中函数调用与返回值的关系是什么
- Linux系统调用-- mmap/munmap函数详解【转】
- 函数调用的底层机制
- 调用PSAPI函数枚举系统进程
- [转]浅析C++中虚函数的调用及对象的内部布局(利用汇编深刻理解C++虚函数底层实现机制)
- 构造函数和析构函数中调用虚函数有什么问题?
- Linux系统调用-- recv/recvfrom/recvmsg函数详解(转)
- J2ME中调用系统API C函数
- fcntl()系统函数调用
- 函数调用的底层机制
- 2000下自定义函数调用不确定性内置系统函数
- 什么时间调用 UpdateData() --MFC函数