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

    调用函数时:

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

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

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

    函数返回时:

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

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

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

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

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

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

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

    __________________________________________________________________________________________________

    • ax(accumulator): 可用于存放函数返回值
    • bp(base pointer): 用于存放执行中的函数对应的栈帧的栈底地址
    • sp(stack pointer): 用于存放执行中的函数对应的栈帧的栈顶地址
    • ip(instruction pointer): 指向当前执行指令的下一条指令
  • 相关阅读:
    win10 下安装pip方法
    visual studio 打开微软MVC3示例MvcMusicStore的详细修改方法
    SQL Server 使用问题解答(持续更新中)
    SQL server数据库备份还原问题备忘(亲测有效)
    visual studio错误中断处理
    Eclipse调试
    nginx +lua +redis 构建自动缓存系统
    批量更新memcached缓存
    SQL Server 2008 表值参数用法
    架构设计方案
  • 原文地址:https://www.cnblogs.com/wangpei0522/p/4254343.html
Copyright © 2011-2022 走看看