zoukankan      html  css  js  c++  java
  • 深入理解计算机系统 第三章 程序的机器级表示 part3

    这周看了刘老师提供的相关视频,以及书中对应的章节“3.7 过程”

    这一节分为运行时栈、转移控制、数据传送、栈上的局部存储、寄存器中的局部存储空间和递归过程这 6 个小节

    其中前 3 小节看懂了一部分内容,后面两个还没来得及看,下周看完补上

    下面记录一下看懂的部分内容

    首先,过程作为一种很重要的抽象(方法、函数都是过程),必然存在互相调用的情况,而过程调用有三个要点(以过程 P 调用过程 Q 为例):

    传递控制:调用过程 Q 时,需将程序计数器指向 Q 的起始地址;调用结束之后,程序计数器需指向过程 P 调用 Q 指令之后的那条指令(该指令地址称为返回地址)

    传递数据:P 向 Q 传递参数,Q 向 P 返回结果

    分配和释放内存:Q 的执行可能需要新的内存空间,使用结束之后,需要将其释放

    运行时栈

    为函数分配的栈空间被称为栈帧,在调用的一开始,就会有定长的栈帧被分配,由于栈向下生长(栈顶的地址在整个栈空间中永远是最小的)。

    所以,分配栈帧,在内存中的表现就是栈顶指针(%rsp)减小一个适当的量。

    上面提到了,Q 在被调用时可能需要新的空间。

    为什么是可能而不是一定呢?

    因为当满足以下条件时,过程并不需要栈帧,只需要使用寄存器处理参数和局部变量即可,条件如下:

    当所有的局部变量都可以保存在寄存器中,且该函数不会调用任何其他过程

    转移控制

    转移控制主要涉及 call 和 ret 这两条指令

    call 指令将控制转移到一个过程的起始,主要做以下两件事:

    跳转到目标过程的起始地址

    将原过程中的返回地址压入栈中(放在原过程栈顶)

    ret 指令弹出原过程栈顶的值,并跳转至对应的返回地址

    数据传送

    参数传递时,前 6 个参数会根据参数位置和数据大小选定对应的寄存器,规则如下表(来源于书):

    如果参数的个数超过 6 个,那么超出的部分需要通过栈来传递(P 调用 Q 时,存储在 P 的栈帧中)

  • 相关阅读:
    JVisualVM远程监控
    周记 2014.11.22
    读取配置文件
    周记 2014.11.15
    MyBatis 逆向工程介绍
    PyTorch模型加载与保存的最佳实践
    ubuntu 服务器 php 环境简单搭建
    【重温广州读书会三青年自白,想念在深圳建会工人斗争中积极声援的他们!!】
    EventBus 3.0 的基本使用
    搭建Hexo博客
  • 原文地址:https://www.cnblogs.com/stone94/p/9980277.html
Copyright © 2011-2022 走看看