OS里关于函数调用机制
2015-03-28 00:25
176 查看
堆栈是C运行时时必须的一个调用路径和参数的空间
——函数调用框架
——传递参数
——保存返回地址
——提供局部变量空间
esp ebp
每个函数都有自己的esp、ebp。
所以递归嵌套的就会产生很深栈积压所以会产生溢出情况。
每个函数的ebp是不一样的,esp在遇到push指令时,像下增长,一般esp -= 4
如果遇pop指令,则esp += 4
函数中的调用是这样的:
![](http://img.blog.csdn.net/20150328150807019?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvTWFya19fWmVuZw==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center)
即在函数A中调用函数B,首先将指向当前代码位置的cs:ip压入当前esp的位置处,然后将push %ebp,然后给esp赋值为ebp。这样函数B的栈环境就搭建好了。众所周知操作系统中内存地址最高的一块儿是栈的空间,但栈的深度一般是有限的,不能无限制像下增长,一旦到了一定的范围就会溢出,因为会侵犯到其他结构的空间,从而造成系统紊乱。
同样当函数B调用完毕之后,就会将movl %ebp,%esp 让栈收缩回来,同时弹出之前的ebp,从而起到了恢复现场的效果。然后ret指令将此时esp指向的空间中的cs:ip出栈,则指向之前函数A的运行地址。
![](http://img.blog.csdn.net/20150328150806470?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvTWFya19fWmVuZw==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center)
一般进入一个新函数首先会扫描函数确定他所用到的变量将其放到栈的底部给其预留一部分空间。(这也是为什么早起编译器要求我们必须要首先定义所有变量,类似于minijava的文法)
——函数调用框架
——传递参数
——保存返回地址
——提供局部变量空间
esp ebp
每个函数都有自己的esp、ebp。
所以递归嵌套的就会产生很深栈积压所以会产生溢出情况。
每个函数的ebp是不一样的,esp在遇到push指令时,像下增长,一般esp -= 4
如果遇pop指令,则esp += 4
函数中的调用是这样的:
即在函数A中调用函数B,首先将指向当前代码位置的cs:ip压入当前esp的位置处,然后将push %ebp,然后给esp赋值为ebp。这样函数B的栈环境就搭建好了。众所周知操作系统中内存地址最高的一块儿是栈的空间,但栈的深度一般是有限的,不能无限制像下增长,一旦到了一定的范围就会溢出,因为会侵犯到其他结构的空间,从而造成系统紊乱。
同样当函数B调用完毕之后,就会将movl %ebp,%esp 让栈收缩回来,同时弹出之前的ebp,从而起到了恢复现场的效果。然后ret指令将此时esp指向的空间中的cs:ip出栈,则指向之前函数A的运行地址。
一般进入一个新函数首先会扫描函数确定他所用到的变量将其放到栈的底部给其预留一部分空间。(这也是为什么早起编译器要求我们必须要首先定义所有变量,类似于minijava的文法)
相关文章推荐
- 关于C语言中函数调用和参数传递机制的探讨
- 关于C语言中函数调用和参数传递机制的探讨(zz)
- 关于C语言中函数调用和参数传递机制的探讨(二 .传递一个参数)
- 关于对话框的知识(函数的调用机制和控件的使用)
- 关于C语言中函数调用和参数传递机制的探讨(三 .传递多个参数等)
- 关于C语言中函数调用和参数传递机制的探讨 (转)
- 关于C语言中函数调用和参数传递机制的探讨
- 关于C语言中函数调用和参数传递机制的探讨
- 关于C++虚函数与普通函数的编译与调用机制
- 关于C语言中函数调用和参数传递机制的探讨
- 关于C语言中函数调用和参数传递机制的探讨(ZZ)
- 关于C语言中函数调用和参数传递机制的探讨(一 .无参数传递)
- 关于C语言中函数调用和参数传递机制的探讨
- 关于C语言中函数调用和参数传递机制的探讨--汇编
- 转载-关于C语言中函数调用和参数传递机制的探讨
- os、os.path 模块中关于文件、目录常用的函数使用方法
- 关于C语言的函数调用过程和数组越界
- 关于显式调用DLL、隐式调用DLL和查看DLL输出函数
- [转载]关于struct device_driver结构中的probe探测函数的调用
- [随便说说]关于函数的显式调用和隐式调用(动态调用)--VC++