OS里关于函数调用机制

堆栈是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的文法)


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值