函数调用发生的寄存器典型调用过程
调用函数时:
调用函数整理需要传给被调函数的参数。通常使用压栈的方式(一般在参数个数超过3个时发生)。一般采用倒序压栈,所有参数入栈后,SP指向第一个参数。(被压栈的参数,通过直接映射到被调用函数的内存映像中,引用始终如此,指针和对象有时如此)
把当前IP(指令寄存器)值压栈,然后调用指令跳转到被调函数的第一条指令处。
由被调函数在堆栈中保存调用函数的SP(栈寄存器)等寄存器值,调整被调函数的寄存器值。
被调函数保存其将会用到的其他寄存器,并将这些寄存器值进行保存(保存现场)。
函数返回时:
如果函数有返回值,则通常将返回值存储到寄存器0.
恢复调用函数的原来寄存器值。
修改SP使其指向被调函数第一个参数压栈前的位置。
从堆栈中找到返回地址并将其存入IP。
通常被调函数越大,所产生的开销也越大,取决于保存恢复所有寄存器、传递参数、调用自定义方法以构造返回值等操作的最大开销。
——————————————————————————————————————————————————————————————
函数的调用会产生跳转指令。跳转指令会造成执行流水线迟滞(执行指令必须等到跳转地址可知才可执行),流水线迟滞会引起处理器等待重定向指令流。每次函数调用产生两次跳转。
__________________________________________________________________________________________________
- ax(accumulator): 可用于存放函数返回值
- bp(base pointer): 用于存放执行中的函数对应的栈帧的栈底地址
- sp(stack pointer): 用于存放执行中的函数对应的栈帧的栈顶地址
- ip(instruction pointer): 指向当前执行指令的下一条指令