第四章 处理器体系结构
指令体系结构:一个处理器支持的指令和指令的字节级编码
4.1Y86指令集体系结构
Y86:包括定义各种状态元素、指令集和它们的编码、一组编程规范和异常事件处理。
4.1.1 程序员可见状态
Y86程序中的每条指令都会读取或修改处理器状态的某些部分。
Y86具体包括:8个程序寄存器、3个条件码ZF\SF\OF、程序计数器(PC)
Y86用虚拟地址引用存储器位置。 程序状态的最后一个部分是状态码Stat,它表明程序执行的总体状态。
4.1.2 Y86指令
4.1.4 Y86异常
对于Y86,当遇到这些异常的时候,我们就简单的让处理器停业执行指令。
在更完整的设计中,处理器通常会调用一个异常处理程序,这个过程被指定用来处理遇到的某种类型的异常。
Y86指令集基本上是IA32指令集的一个子集。它只包括四字节整数操作、寻址方式比较少、操作也较少。因为只有四字节数据,所以称之为“字”不会有任何歧义。
左边是指令的汇编码表示,右边是字节编码。汇编码格式类似于IA32的ATT格式。
4.1.5 Y86程序
Y86指令和IA32代码的主要区别在于,它可能需要多条指令来执行一条IA32指令能完成的所有功能。
Y86没有伸缩寻址模式。
以“.”开头的词是汇编器命令,命令.pos0告诉汇编器应该从地址0处开始产生代码。
创建Y86代码的唯一工具是汇编器。
YIS:指令集模拟器
4.1.6 一些Y86指令的详情
pushl指令会把栈指针减4,并且将一个寄存器值写入存储器中。
因为要入栈的寄存器会被同一条指令修改,通常有两种约定:(1)压入%esp的原始值 (2)压入减去4的%esp的值。
4.2逻辑设计和硬件控制语言HCL
4.2.1 逻辑门
逻辑门是数字电路的基本计算元素,它们的输出,等于它们输入位值的某个布尔函数。
布尔函数AND、OR、NOT的标准符号。
4.2.2 组合电路和HCL布尔表达式
组合电路:讲很多的逻辑门组成一个网,就能构成计算块。
构建这些网有两条限制:①两个或多个逻辑门的输出不能连接在一起,否则他们可能会使线上的信号矛盾,可能会导致一个不合法的电压或电器故障。
②这个网必须是无环的。
4.2.3 字级的组合电路和HCL整数表达式
执行字级计算的组合电力根据输入字的各个为,用逻辑门来计算输出字的各个位。
用中等粗度的线来表示携带字的每个位的线路,用虚线来表示布尔信号结果。
在HCL中,多路复用函数用情况表达式来描述。
算术/逻辑单元是一种很重要的组合电路。
4.2.4 集合关系
判断集合关系的通用格式是:
iexpr in {iexpr1,iexpr2,……,iexprk}
4.2.5 存储器和时钟
组合电路从本质上将,不存储任何信息。
存储设备都是由同一个时钟控制,两类存储器设备包括:
时钟寄存器(寄存器):存储单个位或字,时钟信号控制寄存器加载输入值
随机访问存储器(存储器):存储多个字,用地址来选择该读或该写哪个字
随机访问存储器的例子包括:(1)处理器的虚拟存储器系统(2)寄存器文件
“寄存器”在硬件和机器级编程中的区别:
在硬件中,寄存器直接将它的输入和输出线连接到电路的其他部分;
在机器级编程中,寄存器代表的是CPU中为数不多的可寻址的字,这里的地址是寄存器ID。 Y86处理器会用时钟寄存器保存程序计数器(PC)、条件代码(CC)、程序状态(Stat)。
如果同时读和写同一个寄存器会发生什么?
如果更新一个寄存器,同时在读端口上用同一个寄存器ID,我们会看到一个从旧值到新值的变化,当我们把这个寄存器文件加入到处理器设计中,我们保证会考虑到这个属性的。
边界检查纯粹就是地址输入的函数,不涉及保存任何状态。
只读存储器:用来读指令。这两个存储器被合并为一个具有双端口的存储器:一个用来读指令,另一个用来读或者写数据。
4.3 Y86的顺序实现
4.3.1 将处理组织成阶段
下面是关于各个阶段以及各阶段内执行操作的简略描述:
- 取指:取指阶段从存储器读取指令字节,地址为程序计数器(PC)的值。
- 译码:译码阶段从寄存器文件读入最多两个操作数,得到val A/val B.
- 执行:执行阶段,算术/逻辑单元要么执行指令明确的操作(根据ifun的值),计算存储器引用的有效地址,要么增加或减少栈指针。得到的值称为valE
- 访存:访存阶段可将数据写入存储器或从存储器读出数据
- 写回:最多可写两个结果到存储器。
- 更新PC:将PC设置成下一指令的地址。
4.3.2 SEQ硬件结构
SEQ线路图的画图惯例:
浅灰色方框表示硬件单元
控制逻辑块是用灰色圆角矩形表示的
线路的名字在白色椭圆中说明
宽度为字长的数据连接用中等粗度的线表示
宽度为字节或者更窄的数据连接用细线表示
单个位的连接用虚线表示
4.3.3 SEQ的时序
SEQ的实现包括组合逻辑和两种存储器设备:时钟寄存器(程序计数器和条件码寄存器),随机访问存储器(寄存器文件、指令存储器和数据存储器)。
每个时钟周期,程序计数器都会装在新的指令地址;只有在执行整数运算指令时,才会装载条件码寄存器;只有在执行rmmovl、pushl或call指令时,才会写数据存储器;寄存器文件的两个写端口允许每个时钟周期更新两个程序寄存器。
处理器的原则:处理器从来不需要为了完成一条指令的执行而去读由该指令更新了的状态。
4.3.4 SEQ阶段的实现
作业:
参考文献
1、《深入理解计算机系统》课本第三章
2、实验楼实验指导书:https://www.shiyanlou.com/courses/413 实验五
3、每周重点:http://group.cnblogs.com/topic/73069.html