zoukankan      html  css  js  c++  java
  • 函数调用发生的寄存器典型调用过程

    调用函数时:

    调用函数整理需要传给被调函数的参数。通常使用压栈的方式(一般在参数个数超过3个时发生)。一般采用倒序压栈,所有参数入栈后,SP指向第一个参数。(被压栈的参数,通过直接映射到被调用函数的内存映像中,引用始终如此,指针和对象有时如此)

    把当前IP(指令寄存器)值压栈,然后调用指令跳转到被调函数的第一条指令处。
    由被调函数在堆栈中保存调用函数的SP(栈寄存器)等寄存器值,调整被调函数的寄存器值。

    被调函数保存其将会用到的其他寄存器,并将这些寄存器值进行保存(保存现场)。

    函数返回时:

    如果函数有返回值,则通常将返回值存储到寄存器0.

    恢复调用函数的原来寄存器值。

    修改SP使其指向被调函数第一个参数压栈前的位置。

    从堆栈中找到返回地址并将其存入IP。

    通常被调函数越大,所产生的开销也越大,取决于保存恢复所有寄存器、传递参数、调用自定义方法以构造返回值等操作的最大开销。

    ——————————————————————————————————————————————————————————————

    函数的调用会产生跳转指令。跳转指令会造成执行流水线迟滞(执行指令必须等到跳转地址可知才可执行),流水线迟滞会引起处理器等待重定向指令流。每次函数调用产生两次跳转。

    __________________________________________________________________________________________________

    • ax(accumulator): 可用于存放函数返回值
    • bp(base pointer): 用于存放执行中的函数对应的栈帧的栈底地址
    • sp(stack pointer): 用于存放执行中的函数对应的栈帧的栈顶地址
    • ip(instruction pointer): 指向当前执行指令的下一条指令
  • 相关阅读:
    centos7开启关闭防火墙
    虚拟机vmnet1和vmnet8找不到,注册表没有删除干净,见图
    dhcp和static的区别
    SQL手册
    canal架构原理
    SQL优化(待完善)
    数仓简介
    java逆变与协变(待完善)
    mysqljoin的原理和优化
    深入理解java虚拟机阅读笔记
  • 原文地址:https://www.cnblogs.com/wangpei0522/p/4254343.html
Copyright © 2011-2022 走看看