zoukankan      html  css  js  c++  java
  • Y86处理器的各个阶段

    0x00e:30f480000000        |              irmovl $128,%esp  实现所有Y86指令所需要的计算分为6个基本阶段:取值、译码、执行、访存、写回和更新PC。

    1、取指

    A、取指阶段从存储器读取指令字节,地址为程序计数器(PC) 的值。从指令中抽取出指令指示符字节的两个四位部分,称为icode(指令代码)和ifun(指令功能)。

    例1:rrmovl rA,rB指令,它的字节编码是2 0 rA rB,那么icode:ifun就是2:0。

    B、它可能取出一个寄存器指示符字符,指明一个或两个寄存器操作数指示符rA和rB,这里的rA和rB与上面例子中的rA、rB位置相同。

    例2:  0x00e:30f480000000        |              irmovl $128,%esp 

    那么 rA表示为f,rB表示为4

    C、它还可能取出一个四字节常数字valC。 这个valC就是例2中的128

    D、还有计算当前指令的下一指令的地址 valP,valP等于PC的值加上已取出指令的长度

    最后我们以例2为例,系统的表达一下这个阶段发生了什么事情:

    对于寄存器操作符有两个的操作,这个阶段的通用的表达为  icode:ifun←M1[PC]

       rA:rB←M1[PC+1] 

       valC←M4[PC+2] 

       valP←PC+6

    在例2中,是这样的:icode:ifun←M1[0x00e] =3:0

       rA:rB←M1[0x00f] =f:4

       valC←M4[0x010] =128

       valP←0x00e+6=0x014 

    但是如果寄存器操作符不是两个,而是1个的时候,又会有什么不同呢? 

    例3:0x01a:a02f                         |                  pushl %edx

    在这种情况下就没有了步骤C,其他步骤还是一样 。具体如下:

    icode:ifun←M1[0x01a] =a:0

    rA:rB←M1[0x01b] =2:f

    valP←0x01a+2=0x01c 

    注:上面M1[X]表示访问(读或写)存储器位置X处的一个字节,而M4[X]表示访问四个字节。

    2、译码 

    译码阶段从寄存器文件读入最多两个操作数,得到值valA和/或valB。

    例4:subl %edx,%ebx     

    其中%edx存储的值为9,%ebx存储的值为21,那么valA就会被赋值为%edx的值,valB就会被赋值为%ebx的值。

    这个阶段要看具体的指令而定,如果只有一个操作数:

    例5: pushl rA

    此时发生的事为: valA被赋值为rA的值,valB被赋值为%esp的值,%esp就是栈指针

    例6:popl rA

    此时发生的事为:valA和valB都被赋值为%esp的值 

    3、执行

    在执行阶段,算术/逻辑单元(ALU) 要么执行指令指明的操作(根据ifun的值),计算存储器引用的有效地址,要么增加或减少栈指针。得到的值我们称为valE。

    例7:irmovl $100,%esp 

    此时的操作就相当于valE←0+100=100 

    例8:pushl %edx

    在32位系统中,pushl操作就是将栈指针向下移4个单位,就是减去4,假设此时的%esp为100,则valE←100-4=96,相反,popl操作就是加上4


    4、访存 

     访存阶段可以将数据写入存储器,或者从存储器读出数据。读出的值为valM。与这个阶段有关的操作指令主要是push和pop

    例9:popl %eax

    对于pop操作,属于读数据,因此用valM表示读出的值,valM←M4[valA] ,在此例中,valM被赋值为M4[%eax]

    例10:pushl %edx  ,假设%edx表示的值为9,valE的值为124

    对于push操作,属于写入数据,而写入数据的位置就是栈指针的位置,也就是用执行阶段得到的值valE。表示为M4[valE]←valA,在此例中,就是M4[124]←9

    5、写回 

    这个阶段将执行阶段得到的结果写入到rB,写回阶段最多可以写两个结果到寄存器文件。

    例11:irmovl $128,%esp

    此时会将valE写入到rB,而valE就是128,即R[%esp] ←valE=128

    对于没有rB操作数的指令又会怎么办呢?

    例12:popl rA

    此时会发生R[%esp] ←valE

          R[rA] ←valM

    而pushl操作没变,即R[%esp]←valE

    6、更新PC

    将PC设置成下一条指令的地址,就是将PC设置为valP

    例13: 0x00e:30f480000000        |              irmovl $128,%esp 

    PC←valP=0x014 ,具体分析同例2

  • 相关阅读:
    基于kubernetes v1.17部署dashboard:v2.0-beta8
    kubeadm快速部署Kubernetes单节点
    kafka数据可靠性深度解读
    MySql中4种批量更新的方法
    如何分析Mysql慢SQL
    企业级SSD市场接口之争:SATA会被NVMe取代吗?
    强势回归,Linux blk用实力证明自己并不弱!
    影响性能的关键部分-ceph的osd journal写
    文章汇总(包括NVMe SPDK vSAN Ceph xfs等)
    NVMe over Fabrics:概念、应用和实现
  • 原文地址:https://www.cnblogs.com/zjzsky/p/3451077.html
Copyright © 2011-2022 走看看