函数调用过程

  • 函数的形参实参一般是用栈来储存,这种栈叫做运行栈

  • 运行栈的数据分为一个一个栈帧,每个栈帧对应一次函数调用,栈帧中包含这次函数调用的形参值、控制信息、局部变量、和临时数据。每次函数调用都会有一个栈帧被压入运行栈中,而调用返回后,相应的栈帧会被弹出。

  • 当一个函数要调用其他函数时,要为它所调用的函数设置实参,即将实参压入栈中,运行栈的这一部分空间是主调函数与被调函数都可以直接访问的。(参数的形实参结合,就是通过访问这一部分公共空间完成的)。

  • 被调函数的形参和局部变量的地址是不确定的,但它们的地址相对于栈顶的地址却是确定的,所以可以通过栈顶的地址定位形参与局部变量。

  • esp 寄存器就是用来记录栈顶的地址,称为栈指针

  • ebp 寄存器,用来记录栈顶地址,称为帧指针,记录函数刚调用时栈指针的的位置。所以形参和实参的变量地址通常是通过帧指针来计算,而非栈指针。

返回地址入栈:将当前代码区调用指令的下一条指令地址压入栈中,供函数返回时继续执行
代码区跳转:处理器从当前代码区跳转到被调用函数的入口处
栈帧调整:a、保存当前栈帧状态值,已备后面恢复本栈帧时使用(EBP入栈)
         b、将当前栈帧切换到新栈帧。(将ESP值装入EBP,更新栈帧底部)
         c、给新栈帧分配空间。(把ESP减去所需空间的大小,抬高栈顶)``

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值