第四章
ISA
指令集体系统结构:一个处理器支持的指令和指令的字节级编码。
不同的处理器家族有不同的ISA。
Y86
本章定义的一个简单的指令集。包括各种状态元素、指令和它们的编码、一组编程规范和异常事件处理。
Y86处理器
以顺序指令执行为基础,设计了一个流水化的处理器。将每条指令分成5步,每个步骤都由一个独立的硬件部分或者阶段来处理。每个时钟周期有新的指令进入流水线,即说该处理器可以同时执行5条指令的不同阶段。(重点在于如何处理冒险冲突的情况。数电,EDA中的概念)
4.1.1 程序员可见状态
即:Y86程序中每条指令都会读取或者修改处理器状态的某些部分的状态。
帮助理解 程序员:用汇编代码写程序的人,产生机器代码的编译器。
具体内容 8个程序寄存器(与IA32 一样),3个条件码(ZF,SF,OF)。PC程序计数器存放当前正在执行指令的地址。存储器,很大的字节组,保存着程序和数据。状态码Stat,表明程序的总体状态。(见p232图4—1)
4.1.2 Y86指令
背景知识:一条指令含有一个单字节的指令指示符。可能含有一个单字节的寄存器指示符,还可能含有一个四字节的常数字。字段fn说明是 某个整数操作opl,数据移动条件comvXX,分支条件Jxx。
movl指令:
irmovl , rrmovl , mrmovl , rmmovl .
i:立即数r:寄存器m:存储器。
第一个字母代表源操作数,第二个字符代表目的操作数。
注意:有存储器寻址参与的两种movl指令,采用基址和偏移量形式。不支持第二变址寄存器和任何寄存器值得伸缩。
(p233页有以下详情)
4个整数操作指令:addl,subl,andl,xorl.
7个跳转指令。
6个条件传送指令。
Call指令返回地址入栈,人后跳回目的地址。 Ret指令从这样的调用中返回。
Pushl popl入、出栈。
Hatl将处理器停止,并将状态码设定为HLT。
4.1.3指令编码
每条指令的第一个字节:
高四位0~B表示,是代码部分。手工对指令编码时参照p232页的表格。注意rrmovl和cmovXX取值一样。
低四位是功能部分。除了opl,jXX,cmovXX以外全为0.这三者的指令对应的值,参照p233页的图。
附加部分:
寄存器指示符:参照p234页的表格,对应的寄存器的编号。
4字节的常数字(这个部分采用小端法):
- irmovl中的立即数数据
- mmovl,mrmovl中存储器m地址指示符的偏移量
- 分支指令jXX的目的地址(绝对地址)
- 调用指令call的目的地址(绝对地址)
根本前提:字节编码和指令序列是一一对应的。
4.1.4Y86异常
使用状态码stat描述。一共有四种取值。(见p237)在Y86中除了等于1以外的其他情况,都会使处理器停止(在IA32或者更完整设计的ISA中,都会调用一个异常处理程序但这个是简化版咯。)
4.1.5Y86完整的程序
和IA32的汇编程序一样,包括代码段数据段和代码。“.”开头的词语是汇编器命令。
理解见p238.239.240的程序。基本和汇编程序是一样的。
4.2逻辑设计
这部分与以前学习过的电子电路,数字电路,EDA关联性非常大。
前提知识点:
*逻辑1是用1V左右的高电压表示的。
*逻辑0使用0V左右的低电压表示的。
*实现一个数字系统:计算对位进行操作的函数的组合逻辑、存储位的存储器元件、控制存储器元件更新的时钟信号。
4.2.1逻辑门:
只对单个位的数进行操作,而不是整个字。
与:&& 或: || 非: !
4.2.2组合电路:
很多逻辑门组合成一个网构建的计算块。(注意两个或多个输出不能连接在一起,并且无环。)
HCL表达式与C语言中的表达式的区别:
*HCL中输出会持续随着输入变化而变化。而C语言中只有在程序执行到的时候才进行求值。
*HCL只对0和1操作。C语言中,0是FLASE,除了0以外的所有整数都是TRUE
*C中&&和||这两种,是优先求值,(&和|并不是)第一个值就能确定结果的话,它不会去计算第二个值。但是HCL中并没有这样的规则。
4.2.3字级的组合电路和HCL整数表达式
例如:bool eq=(A==B);
在HCL硬件描述语言中,每个字都可以声明为特定的位数。允许描述自是否相等。输出eq表示AB是否相等。
画字级电路的时候,实线表示携带字的每个位的线路,虚线表示布尔信号的结果。
多路复用函数使用情况表达式描述:
[
Select:expr
]
Select代表什么时候选择这种情况
Expr表示该种情况得到的数值
注意:顺序执行,第一个求值为1 的情况会被选中。一般最后一个表达式是 1:expr。表示的意思是前面所有情况都没有选中,就执行最后这个。
例如:
Int out=[
S&&q :a
S&&w:b
1 :c
]
算术逻辑单元:
两部分组成:数据输入,控制输入。
控制输入代表不同的算术或逻辑操作。
0:+
1:-
2:&
3:^
4.2.4集合关系
书上的引入例子是数据选择器,是EDA 中学习的七个基本集合电路中的一个。
4.2.5存储器和时钟
时钟寄存器:(硬件寄存器)存储单个位或字。时钟信号控制寄存器加载输入值。
随机访问存储器(存储器)存储字,用地址来选择该读或该写那个字。
4.3Y86的顺序实现
处理指令阶段化:
取值、译码(从寄存器读入最多两个操作数)、执行、访存(写入,读出存储器)、写回(写最多两个结果到寄存器)、更新PC(设置为下一条指令的地址)。
取值:valC四字节常数字valP下一条指令的地址。
译码:从寄存器读入的数valA,valB.
执行:计算出的值valE.
访存:从存储器读出的值valM.
写回:写入寄存器的结果。
更新PC
SEQ硬件结构:
计算中不一样的地方:
四个寄存器的ID信号:srcA,valA的源;srcB,valB的源;dstE,写入valE的寄存器;dstM,写入valM的寄存器。
SEQ的时序:
需要时序控制的控制的四个硬件:程序计数器、条件码寄存器、数据寄存器、寄存器文件。
它们的值要等时钟信号(上升沿或者下降沿来临时才改变)。
SEQ阶段的实现:
取值:第一个字节Split:由icode和ifun组成。Align:一字节的寄存器指示符和四字节的常数字。
译码和回写:读、写端口都有一个地址连接(寄存器ID)和数据连接(寄存器文件的输出、入字)。
执行阶段
访存阶段更新PC
参考资料:《深入理解计算机系统》