在《深入理解计算机系统》一书中,作者自己定义了一个新的指令集,Y86-64,它其实就是X86-64的精简版,来说明处理器的体系结构。
1、Y86-64指令集体系结构(ISA)
该指令集有15个程序寄存器、3个条件码、程序寄存器(PC)、程序状态、内存,如下所示。
下面是具体指令,左边是指令的会编码表示,邮编是字节编码,其中fn表示它可以取0~9任意数字,也就是它还有很多别的指令。具体看下面的图。
2、逻辑设计
在数字电路之中,最基本的逻辑电路就是与或非三个电路,后面所有的逻辑电路基本都是这三者组合而成。
3、Y86-64的实现顺序
一条指令,对于处理器来说,他会有以下操作:
<1>取指(fetch):取指阶段从内存读取指令字节,地址为程序计数器的值。从指令中抽取出指令指示符字节的两个部分,称为icode(指令代码)和ifun(指令功能)。它可能取出一个寄存器指示符字节,指明一个或两个寄存器操作数指示符rA和rB。它还可能取出一个四字节常数字valC。它按顺序方式计算当前指令的下一条指令的地址valP。也就是说,valP等于PC的值加上已取出指令的长度。
<2>译码(decode):译码阶段从寄存器文件读入最多两个操作数,得到值valA和valB。通常,它读入指令rA和rB字段指明的寄存器,不过有些指令是寄存器%esp的。
<3>执行(execute):在执行阶段,算术/逻辑单元(ALU)要么执行指令指明的操作(根据ifun的值),计算内存引用的有效地址,要么增加或减少栈指针。得到的值我们称为valE。在此,也可能设置条件码。对一条条件传送指令来说,这个阶段会检验天骄码和传送条件(由ifun给出),如果条件成立,则更新目标寄存器。同样,对一条跳转指令来说,这个阶段会决定是不是应该选择分支。
<4>访存(memory):访存阶段可以将数据写入内存,或者从内存读出数据。读出的值为valM。
<5>写回(write back):写回阶段最多可以写两个结果到寄存器文件。
<6>更新PC(PC update):将PC设置成下一条指令的地址。
4、Y86的流水线实现
相较于前者的设计,所谓的流水线实现,就是将PC的计算放在了开始时,使之更加适合于流水线。