您的位置:首页 > 其它

OS里关于函数调用机制

2015-03-28 00:25 176 查看
堆栈是C运行时时必须的一个调用路径和参数的空间

——函数调用框架

——传递参数

——保存返回地址

——提供局部变量空间

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的文法)
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: