首页 > 代码库 > 函数调用发生的寄存器典型调用过程
函数调用发生的寄存器典型调用过程
调用函数时:
调用函数整理需要传给被调函数的参数。通常使用压栈的方式(一般在参数个数超过3个时发生)。一般采用倒序压栈,所有参数入栈后,SP指向第一个参数。(被压栈的参数,通过直接映射到被调用函数的内存映像中,引用始终如此,指针和对象有时如此)
把当前IP(指令寄存器)值压栈,然后调用指令跳转到被调函数的第一条指令处。
由被调函数在堆栈中保存调用函数的SP(栈寄存器)等寄存器值,调整被调函数的寄存器值。
被调函数保存其将会用到的其他寄存器,并将这些寄存器值进行保存(保存现场)。
函数返回时:
如果函数有返回值,则通常将返回值存储到寄存器0.
恢复调用函数的原来寄存器值。
修改SP使其指向被调函数第一个参数压栈前的位置。
从堆栈中找到返回地址并将其存入IP。
通常被调函数越大,所产生的开销也越大,取决于保存恢复所有寄存器、传递参数、调用自定义方法以构造返回值等操作的最大开销。
——————————————————————————————————————————————————————————————
函数的调用会产生跳转指令。跳转指令会造成执行流水线迟滞(执行指令必须等到跳转地址可知才可执行),流水线迟滞会引起处理器等待重定向指令流。每次函数调用产生两次跳转。
函数调用发生的寄存器典型调用过程
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。