zoukankan      html  css  js  c++  java
  • 计算机操作系统(三)--- 处理器体系结构(三)(转)

               文章部分图片文字来自参考文章,参考文章总结地很好。

    指令处理阶段

              为了降低实现的复杂性,采用统一的框架,这样可以共用一些部件.我们将Y86的指令处理组织成如下几个阶段:

    • 取指(Fetch):从指令寄存器读取指令.
    • 译码(Decode):读取程序寄存器.
    • 执行(Execute): ALU计算结果(分为两种一种是计算值(用于更新程序寄存器),一种是计算存储器引用的有效地址).
    • 访存(Memory):读写存储器.
    • 写回(Write Back):写回寄存器文件.
    • 更新PC(PC update):将PC设置成下一条指令的地址.

             先大家只需要了解一下一条指令执行的要经历的阶段,后面会分析Y86的具体指令的执行过程.

    需要注意的两点:

    1.在统一框架下,每条指令都会经历以上所有阶段.

    2.在SEQ/SEQ+里,各个阶段是顺序进行的,但一个阶段内的内容基本上(有例外,稍后再说)是并行执行的.

     

    Y86指令的执行

             下面是各种指令处理的各个阶段,大家可以一扫而过,看我的分析结果,再对照着图就很容易理解.








            看到上面的指令处理的各个阶段是不是天花乱坠啊.其实一点不复杂,因为使用的是统一的框架.总结起来就如下几点:

    (1).首先要看指令到底要干啥,它的操作数是啥,明确数据流的方向.

           比如opl, rrmovl, irmovl, cmovXX都不涉及到存储器,都是将Execute阶段中的执行结果valE给某个程序寄存器.(数据流方向: valE->程序寄存器).

           比如mrmovl, popl的数据流方向是:存储器->程序寄存器.以为这肯定要从存储器中取出valM,再给这个程序寄存器.

           比如rmmovl的数据流方向是:程序寄存器->存储器,肯定会写入存储器.

    (2).写入程序寄存器的数据有两种来源,一种是valE(opl,rrmovl, irmovl, pushl,  popl, call, ret,cmovXX),一种是valM(mrmovl, popl).

    (3). pushl, popl, call, ret都涉及了"栈"(存储器),都会更新%esp(%esp+/-4:在执行阶段计算出来valE).将valE写回%esp.

    (4). opl在执行阶段会设置CC, cmovXX, jXX在执行阶段会有一个判断逻辑.

    (5).只有rmmovl, pushl和call需要写回存储器.

    (6).统一处理的原则:在excute阶段,valA尽量不参与运算,使用valB参与运算;在memory阶段,都是valA参与运算(为了使得pushl和rmmovl统一处理).

    (7).总结

    疑点

    ————

    1. rrmovl的execute阶段本不需要运算,为什么要执行"valE = 0+valA"?

    答:使用的是统一的框架,每条指令都必须通过每个阶段.这样做还有一个好处,减少信号传递的数量.写回都是通过valE和valM的,而不需要valA.

    2.为什么是mrmovl D(rB), rA而不是 mrmovl D(rA), rB?

    答:统一处理 mrmvol和rmmovl.这样保证了"execute阶段, valA尽量不参与运算,使用valB参与运算".

    3. popl rA的Write back阶段需要写两个寄存器.这两个写应该是有次序的啊?

    答:是的.为了保证"popl%esp"的语义同IA32一致,"R[%esp]<-valE"必须在"R[rA]<-valM"之前,这意味着按照只能在上升沿update的规则,就需要2个cycles来执行(违反了原则)。

    4. pushl rA怎么没有问题?

    答:由于在SEQ CPU中.因为读取的值在某根信号线(指的是valA信号)上存在着.即便是"pushl %esp", %esp的值已经在valA信号线上了,只需要将valA的值写回存储器即可.

    参考文章:

    1.https://blog.csdn.net/dennis_fan/article/details/8280141

  • 相关阅读:
    Linq 中的Select事例
    C#关于事件的几个好例子
    C#运用实例.读取csv里面的词条,对每一个词条抓取百度百科相关资料,然后存取到数据库
    cookie 和 session 基本使用 以及 封装
    javascript 兼容各个浏览器的事件
    jquery选择器从认识到使用初级篇
    作业八—Alpha阶段项目总结
    第十四次
    第十三次
    十二次
  • 原文地址:https://www.cnblogs.com/Benjious/p/9749615.html
Copyright © 2011-2022 走看看