第四章 处理器体系结构
(一)知识点总结
一、Y86指令集体系结构
1.Y86处理器状态类似于IA32,有8个程序寄存器:
%eax、%ecx、%edx、%ebx、%esi、%edi、%esp、%ebp。处理器的每个程序寄存器存储一个字。%esp被入栈、出栈、调用和返回指令作为栈指针。
2.3个一位的条件吗:ZF、SF、OF,它们保存最近的算术或逻辑指令所造成影响的有关信息。程序计数器PC存放当前正在执行指令的地址。
3.程序状态的最后一个部分是状态码stat,它表明程序执行的总体状态
4.Y86指令集如下(所有数值都用十六进制表明)
5.IA32的movl指令:irmovl、rrmovl、mrmovl、rmmovl。指令名字第一个字母代表源的类型。源可以是立即数(i)、寄存器(r)、存储器(m),目的可以是寄存器(r)、存储器(m)
6.两个存储器传送指令中的存储器引用方式是基址和偏移量形式
①4个整数操作指令:addl、subl、andl、xorl
②7个跳转指令:jmp、jle、jl、je、jne、jge、jg
③6个条件传送指令:cmovle、cmovl、cmove、cmovne、cmovge、cmovg
④Halt指令停止指令的执行
7.指令编码
①每条指令需要1—6个字节不等。每条指令的第一个字节表示指令的类型,这个字节分为两个部分,每部分4位:高4位是代码部分,低4位是功能部分
②rrmovl与条件传送有同样的指令代码,可以看做“无条件传送”,jmp是“无条件跳转”,它们的功能代码都是0.
③8个寄存器对应的0-7寄存器标识符
④可能有附加的寄存器指示符字节,指定一个或两个寄存器,这些寄存器字段为rA、rB。
⑤有些指令要一个附加的4字节常数字,能作为irmovl的立即数数据,rmmovl和mrmovl的地址指示符的偏移量,以及分支指令和调用指令的目的地址(是绝对地址)。所有整数采用小端法编码,当指令按照反汇编格式书写时,这些字节以相反顺序出现。
8.Y86异常
以“.”开头的词是汇编器命令,它们告诉汇编器调整地址,以便在那里产生代码或插入一些数据
9.信息= 位+上下文。 第4章,位(串)就是Y86机器码,上下文就是图4-2,信息就是Y86指令集。
二、逻辑设计和硬件控制语言HCL
1.逻辑门:&&、|| 、!
2.组合电路:很多逻辑门组合成一个网,构建计算块。构建这些网有两条限制
①两个或多个逻辑门的输出不能连接在一起,否则可能会使线上的信号矛盾,导致一个不合法的电压或电路故障
②网必须无环
3.字级的组合电路和HCL整数表达式
一些位级信号代表一个整数或一些控制模式。执行字级计算的组合电路根据输入字的各个位,用逻辑门来计算输出字的各个位。
4.多路复用器:根据输入控制信号的值,从一组不同的数据信号则选出一个。多路复用函数是用情况表达式描述的。
5.算数/逻辑单元是很重要的组合电路,有三个输入,标号为A、B的两个数据输入和一个控制输入。根据控制输入的设置,电路会对数据输入执行不同的算数或逻辑操作。
6.判断集合关系的通用格式
Iexpr in {iexpr1,iexpr2,…,iexprk}
7.两类存储器设备
①时钟寄存器(简称寄存器)存储单个位或字,时钟信号控制寄存器加载输入值
②随机访问存储器(简称存储器)存储多个字,用地址来选择该读或该写哪个字
8.Y86处理器会用时钟寄存器保持程序计数器(PC)、条件代码(CC)、程序状态(Stat)
9.寄存器文件有两个读端口(A、B)还有一个写端口(W),多端口随机访问存储器允许同时进行多个读和写操作。
三、Y86的顺序实现
1.将处理组织成阶段
①取指:取指阶段从存储器读取指令字节,地址为程序计数器PC的值
②译码:译码阶段从寄存器文件读入最多两个操作数
③执行:在执行阶段,算数/逻辑单元要么根据ifun的值执行指令指明的操作,计算机存储器引用的有效地址,要么增加或减少栈指针
④访存:访存阶段可以将数据写入存储器,或从存储器读出数据
⑤写回:写回阶段最多可以写两个结果到寄存器文件
⑥更新PC:将PC设置成下一条指令的地址
2.执行rrmovl指令和执行算术运算类似,不过不需要取第二个寄存器操作数。将ALU的第二个输入设为0,先把它和第一个操作数相加,得到valE=valA,然后再把这个值写到寄存器文件。
3.对irmovl的处理与上类似,除了ALU的第一个输入为常数值valC。因为是长指令格式,对于irmovl,程序计数器必须加6。所有这些指令都不改变条件码
4.pushl指令开始时很像前面讲过的指令,但在译码阶段,用%esp作为第二个寄存器操作数的标识符,将栈指针赋值为valB。在执行阶段用ALU将栈指针减4,减过4的值就是存储器写的地址,在写回阶段还会存到%esp中。
5.popl指令的执行与pushl的执行类似,除了在译码阶段要读两次栈指针以外。popl应该首先读存储器,然后再增加栈指针。
6.call指令、ret指令和pushl、pop类似。指令call:将call指令后面跟着的那条指令的地址valP压入栈中,在更新PC阶段将PC设为调用目的地valC。指令ret:在更新PC阶段,将从栈中取出的值valM赋值给PC。
7.SEQ的实现包括组合逻辑和两种存储器设备:时钟寄存器、随机访问存储器。
8.需要对时序进行明确控制的四个硬件单元——程序计数器、条件码寄存器、数据存储器、寄存器文件。
9.计算原则:处理器从不需要为了完成一条指令的执行而去读由该指令更新了的状态。在时钟上升开始下一个周期时,处理器就可以同时执行寄存器写和存储器写。
有些指令(整数运算)会设置条件码,有些指令(跳转指令)会读取条件码,但没有指令必须既设置又读取条件码。虽然到时钟上升开始下一个周期时才会设置条件码,但是在任何指令试图读之前,它们都会更新。
10.常用常数
11.SEQ阶段的实现
①取指阶段
取指阶段包括指令存储器硬件单元。以PC作为第一个字节(字节0)的地址,这个单元一次从存储器读出6个字节,第一个字节被解释称指令字节,分为两个4位数。标号为“icode”和“ifun”的控制逻辑块计算指令和功能码等于从存储器读出值,或者当指令地址不合法时(imem_error指明),这些值对应于nop指令
②译码和写回阶段
都要访问寄存器文件。寄存器文件有四个端口,支持同时进行两个读(端口A、B)和两个写(E、M),每个端口都有一个地址连接和一个数据连接。根据指令代码icode以及寄存器指示值rA和rB,可能还会根据执行阶段计算出的Cnd条件信号。
③执行阶段
执行阶段包括算术/逻辑单元(ALU)第一步每条指令的ALU计算,执行阶段还包括条件码寄存器
④访存阶段
访存阶段的任务是读或者写程序数据,两个控制块产生存储器地址和存储器输入数据的值,另外两个块产生控制信号表明应该执行读操作还是写操作。当执行读操作时数据存储器产生值valM
⑤更新PC阶段
SEQ中最后一个阶段会产生程序计数器的新值,依据指令的类型和是否要选择分支,新的PC可能是valC、valM、valP
(二)实验过程
构建YIS环境:
YIS测试:
cd y86-code进入测试代码,教材p239页代码为asuml.ys,可以通过make asuml.yo进行汇编,asuml.yo就是汇编后的结果
make all可以汇编运行所有代码结果:
(三)参考资料
1.《深入理解计算机系统》
2.《嵌入式Linux应用程序开发标准教程》
3.《Y86 Tools》
(四)学习感想及总结
本章主要学习了Y86指令集体系结构、逻辑设计和硬件控制语言HCL、Y86的顺序实现,根据教材上的详细图示我了解了Y86汇编程序与I32汇编程序的不同,掌握了Y86指令OP1、rrmovl、irmovl、rmmovl、mrmovl、pushl、popl等指令在顺序实现中的计算。在构建YIS环境的实验中,我一开始也遇到了不能解析命令地址这个问题。在老师把外网地址修改成内网地址之后就成功地连接到了主机,不过实验最后显示make:***[all]错误,我不知道这个什么错误以及错误原因,望老师指正。