第六周学习总结
第四章 处理器体系结构
4.1 Y86指令集体系结构
定义一个指令集体系结构,例如Y86,包括定义各种状态元素、指令集和他们的编码、一组变成规范和异常事件处理。
4.1.1 程序员可见的状态
①程序员可见的状态:Y86中每条指令都会读取或修改处理器状态的某些部分。这里的“程序员”既可以是用汇编代码写程序的人,也可以是产生机器代码的编译器。
Y86的处理器状态类似IA32。有8个程序寄存器:%eax,%ecx,%edx,%ebx,%esi,%esp和%ebp。处理器的每个程序寄存器存储一个字。
②存储器,从概念上来说是一个很大的字节数组,保存着程序和数据。
Y86程序用虚拟地址来引用存储器位置。硬件和操作系统软件联合起来将虚拟地址翻译成实际或物理地址,指明数据实际保存在存储器那个地方。
③状态码stat:它表明程序执行的总体状态,会指示是正常运行还是出现了某种异常。
4.1.2 Y86指令
Y86指令集基本上是IA32指令集的一个子集,只包括四字节整数操作,寻址方式比较少,操作也较少。
IA32的movl指令分成了四个不同的指令:irmovl,rrmovl,mrmovl,rmmovl 显示的指明源和目的。
源可以是立即数i,寄存器r,存储器m 目的可以是寄存器r,存储器m
不允许从存储器到存储器,也不允许将立即数传到存储器。
4个整数操作指令:addl,subl,andl,xorl 只对寄存器数据进行操作,会设置3个条件码
7个跳转指令:jmp,jle,jl,je,jne,jge,jg
6个条件传送指令:cmovle,comvl,cmove,cmovne,cmovge,cmovg
call指令将返回地址入栈,然后跳到目的地址。ret从这样的过程调用中返回
pushl,popl实现入栈和出栈
halt停止指令的执行,会导致处理器停止,并将状态码设置为HLT
4.1.3 指令编码
每条指令需要1-6个字节不等,每条指令的第一个字节表明指令的类型。
1.第一个字节
这个字节分为两个部分,每个部分4位:
- 高四位:代码部分,值域为0~0xB
- 第四位:功能部分,功能值只有在一组相关指令共用一个代码时才有用。
比如:课本第233页,Y86指令集的功能码:
整数操作里代码部分均为6,功能部分区分addl,subl,andl,xorl
分支指令里代码部分均为7
传送指令里代码部分均为2
这里要注意rrmovl归到了传送指令里,前面说过它们有相同的指令代码
8个程序寄存器中每个都有相应的0~7的寄存器标识符,程序寄存器存在CPU中的一个寄存器文件中,这个寄存器文件就是一个小的、以寄存器id作为地址的随机访问存储器。
当需要指明不应访问任何寄存器时,用ID值0xF表示
2.有的需要额外的字节
(1)附加的寄存器指示符字节
指定一个或两个寄存器,例如rA或者rB。
- 没有寄存器操作数的指令,例如分支指令和call指令,就没有寄存器指示符字节。
- 只需要一个寄存器操作数的指令(irmovl,pushl,popl)将另一个寄存器指示符设为0xF
(2)附加的4字节常数字
这个字的用处:
1.irmovl的立即数数据
2.rmmol和mrmovl的地址指示符的偏移量
3.分支指令和调用指令的目的地址
注意事项
1.分支指令和调用指令的目的地址是一个绝对地址
2.所有整数采用小端法编码
4.1.4 Y86异常
对于Y86,当遇到这些异常的时候,我们就简单的让处理器停业执行指令。
在更完整的设计中,处理器通常会调用一个异常处理程序,这个过程被指定用来处理遇到的某种类型的异常。
4.1.5 Y86程序
Y86和IA32的区别
1.Y86有时需要两条指令来完成IA32一条指令就能完成的事
2.Y86没有伸缩寻址模式
4.1.6 一些Y86指令的详情
4.2 逻辑设计和硬件控制语言HCL
4.2.1 逻辑门
1.逻辑门产生的输出,等于它们输入位值的某个布尔函数。
2.
AND &&OR ||NOT !
3.逻辑门只对单个位的数进行操作,而不是整个字。
4.逻辑门总是活动的,输入变化输出很快就跟着变化。
4.2.2 组合电路和HCL布尔表达式
组合电路:讲很多的逻辑门组成一个网,就能构成计算块。
构建这些网有两条限制:
①两个或多个逻辑门的输出不能连接在一起,否则他们可能会使线上的信号矛盾,可能会导致一个不合法的电压或电器故障。
②这个网必须是无环的。
4.2.3 字节的组合电路和HCL整数表达式
4.2.4 集合关系
判断集合关系的通用格式是:
iexpr in {iexpr1,iexpr2,...,iexprk}
iexpr等都是整数表达式。
4.2.5 存储器和时钟
1.时序电路的两类存储器设备:
(1)时钟寄存器(简称寄存器):储存单个位或字。
(2)随机访问储存器(简称储存器):储存多个字,用地址选择该读/写哪个字。
寄存器分为“硬件寄存器”和“程序寄存器”。
2.Y86处理器
它会用时钟寄存器保存程序计数器PC,条件代码CC和程序状态Stat。
4.3 Y86的顺序实现
4.3.1 将处理组织成阶段
下面是关于各个阶段以及各阶段内执行操作的简略描述:
- 取指:取指阶段从存储器读取指令字节,地址为程序计数器(PC)的值。
- 译码:译码阶段从寄存器文件读入最多两个操作数,得到val A/val B.
- 执行:执行阶段,算术/逻辑单元要么执行指令明确的操作(根据ifun的值),计算存储器引用的有效地址,要么增加或减少栈指针。得到的值称为valE
- 访存:访存阶段可将数据写入存储器或从存储器读出数据
- 写回:最多可写两个结果到存储器。
- 更新PC:将PC设置成下一指令的地址。
- 程序计数器放在寄存器中,位于左下角PC。
- 信息随着线流动,方向是先向上再向右
- 反馈先祖在右边向下
- 所有硬件单元的处理都在一个时钟周期内完成。
- 浅灰色方块表示硬件单元
- 控制逻辑块是用灰色圆角矩形表示的
- 线路的名字在白色椭圆中说明
- 宽度为字长或更窄的数据连接用细线
- 单个位的连接用虚线。
4.3.2 SEQ硬件结构
SEQ抽象视图的画法:
- 程序计数器放在寄存器中,位于左下角PC。
- 信息随着线流动,方向是先向上再向右
- 反馈先祖在右边向下
- 所有硬件单元的处理都在一个时钟周期内完成。
- 浅灰色方块表示硬件单元
- 控制逻辑块是用灰色圆角矩形表示的
- 线路的名字在白色椭圆中说明
- 宽度为字长或更窄的数据连接用细线
- 单个位的连接用虚线。
4.3.3 SEQ的时序
一个时钟变化会引发一个经过组合逻辑的流来执行整个指令。
SEQ的实现包括组合逻辑和两种存储器设备:
时钟寄存器:程序计数器和条件码寄存器
随机访问存储器:寄存器文件、指令存储器和数据存储器
组合逻辑不需要时序或控制。
四个硬件单元需要时序进行明确控制:程序计数器、条件码寄存器、数据存储器和寄存器文件,通过一个时钟信号来控制,它触发将新值装载到寄存器以及将值写到随机访问存储器。即要控制处理器中的时序,只需要寄存器和存储器的时钟控制。
4.3.4 SEQ阶段的实现
1、取指阶段
以PC作为起始地址,从指令存储器中读出六个字节。
根据这些字节,产生出各个指令字段。PC增加模块计算信号valP。
2、译码和写回阶段
指令字段译码,产生寄存器文件使用的四个地址(两个读和两个写)的寄存器标识符。
从寄存器文件中读出的值成为信号valA和valB。两个写回值valE和valM作为写操作的数据。
3、执行阶段
ALU要么为整数运算指令执行操作,要么作为加法器。
根据ALU的值,设置条件码寄存器。检测条件码的值,判断是否该选择分支。
4、访存阶段
数据存储器既可以写,也可以读存储器的值。从存储器读出的值就形成了信号valM。
5、更新PC阶段
根据指令代码和分支标志,从信号valC、valM和valP中选出下一个PC的值。
参考资料:
百度百科
闫佳歆同学的博客