php在空值时调用成员函数_C|主调函数调用被调函数时,编译器的一系列的动作...

当主调函数调用被调函数及返回时,编译器会有一系列的动作,主要由参数传递、地址跳转、局部变量分配和赋初值、执行函数体、结果返回、堆栈平衡等几个步骤组成。

1 主调函数调用被调函数

a 如果被调返回复合类型(如结构体),需要在主调函数的栈空间中开辟一块空间用于保存返回值(一个寄存器无法保存的数据)。

b 参数入栈:将实参值从右向左依次压入系统栈中;c 返回地址入栈:将当前代码区调用指令的下一条指令地址压入栈中,供函数返回时继续执行,一般由call指令完成;

d 代码区跳转:处理器从当前代码区跳转到被调用函数的入口处,一般也是由call指令完成;

e 栈帧调整:具体包括:

① 保存当前栈帧状态值,以便在后面恢复本栈帧时使用(EBP入栈);

② 将当前栈帧切换到新栈帧。(将ESP值装入EBP,更新栈帧底部);

③ 给新栈帧分配空间。(把ESP减去所需空间的大小,抬高栈顶);

f 相关寄存器压栈,编译器计算并分配函数所需栈帧空间并将空间进行初始化。

e 执行被调用函数,如果有局部变量,则在栈内分配空间。

f 值返回。

return语句将返回值返回到主调函数。在底层,参数是通过EAX寄存器或EDX寄存器传递给主调函数。或浮点计算单元的寄存器(浮点数返回值),或在主调函数中预先开辟栈空间来保存被调函数的返回值(如结构体变量返回值)。

类似于下图的操作:

628543684623e8e94fedafec35589ac4.png

2 返回后的堆栈平衡

函数的"}"被解释为函数体已经执行完。遇到"}"时,会将堆栈中的局部变量、程序中压入堆栈的寄存器的值全部弹出,将之前CALL指令执行时压入堆栈的函数返回地址弹到指令指针寄存器EIP,从而返回到主调函数。

当函数运行结束时,系统内部又一系列的动作,这些恰巧与调用函数时的动作顺序相反。

(1) 释放栈内局部变量空间

(2) 释放栈内参数空间

(3) 退栈,得到返回地址,程序跳转到调用函数处等待继续执行

(4) 退栈,得到程序运行状态,恢复调用函数前的状态。

(5) 释放该函数的栈空间

以下区分返回基本变量值与返回复合类型(如结构体变量)的汇编代码:

a5bd7a226d7def9e3ce624275da3a8f4.png

-End-

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
YOLO高分设计资源源码,详情请查看资源内容中使用说明 YOLO高分设计资源源码,详情请查看资源内容中使用说明 YOLO高分设计资源源码,详情请查看资源内容中使用说明 YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值