重要知识点
指令集体系结构
一个处理器支持的指令和指令的字节级编码称为它的指令集体系结构。
Y86处理器
Y86处理器状态类似于IA32。有8个程序寄存器:%eax,%ecx,%edx,%ebx,%esi,%edi,%esp和%ebp。处理器每个程序寄存器存储一个字。寄存器%esp被入栈、出栈、调用和返回指令作为栈指针。在其他情况中,寄存器没有固定的含义或固定值。有3个一位的条件码:ZF、SF和OF,它们保存最近的算术或逻辑指令所造成影响的相关信息。程序计数器(PC)存放当前正在执行的指令地址。
Y86指令
字节 | |
halt | 0 0 |
nop | 1 0 |
rrmovl rA,rB | 2 0 rA rB |
irmovl V,rB | 3 0 FrB V |
rmmovl rA,D(rB) | 4 0 rA rB D |
mrmovl D(rB),rA | 5 0 rA rB D |
OPl rA,rB | 6 fn rA rB |
jXX Dest | 7 fn Dest |
comvXX rA,rB | 2 fn rA rB |
call Dest | 8 0 Dest |
ret | 9 0 |
pushl rA | A 0 rA F |
popl rA | B 0 rA F |
注:rA、rB为寄存器标识符,V,D,为常数,Dest为地址。
Y86指令编码
整数操作编码
addl | 6 | 0 |
subl | 6 | 1 |
andl | 6 | 2 |
xorl | 6 | 3 |
分支操作编码
jmp | 7 | 0 |
jle | 7 | 1 |
jl | 7 | 2 |
je | 7 | 3 |
jne | 7 | 4 |
jge | 7 | 5 |
jg | 7 | 6 |
传送指令编码
rrmovl | 2 | 0 |
cmovle | 2 | 1 |
cmovl | 2 | 2 |
cmove | 2 | 3 |
cmovne | 2 | 4 |
cmovge | 2 | 5 |
cmovg | 2 | 6 |
Y86的寄存器标识符(ID)
数字 | 寄存器 |
0 | %eax |
1 | %ecx |
2 | %edx |
3 | %ebx |
4 | %esp |
5 | %ebp |
6 | %esi |
7 | %edi |
F | 无寄存器 |
Y86异常
值 | 名字 | 含义 |
1 | AOK | 正常操作 |
2 | HLT | 处理器执行halt指令 |
3 | ADR | 遇到非法地址 |
4 | INS | 遇到非法指令 |
Y86的pushl指令
pushl指令会把栈指针减4,并且将一个寄存器值写入存储器中。因此,当执行pushl%esp指令时,处理器的行为是不确定的·,因为要入栈的寄存器会被同一条指令修改。通常有两中约定:1)压入%esp的原始值,2)压入减去4的%esp的值。
逻辑设计
在当前的技术中,逻辑1是用1.0伏特左右的高电压表示的,而逻辑0是用0.0伏特左右的低电压表示的。要实现一个数字系统需要三个主要组成部分:计算对位进行操作的函数的组合逻辑、存储位的存储器元素,以及存储器元素更新的时钟信号。
C语言中符号运算符的逻辑门下面是对应的HCL表达式:AND用&&表示,OR用||表示,而NOT用!表示。
将很多的逻辑门组合成一个网,就能构建计算块,称为组合电路。构建这些网有两条限制:
- 两个或多个逻辑门的输出不能连在一起。否则它们可能会使线上的信号矛盾,可能会导致一个不合法的电压或电路故障。
- 这个网必须是无环的。也就是在网中不能有路径经过一系列的门而形成一个回路,这样的回路会导致该网络计算的函数有歧义。
存储器和时钟
组合电路从本质上讲,不存储任何信息。它们只是简单地响应输入信号,产生等于输出的某个函数的输出。为了产生时序电路,也就是有状态并且在这个状态上进行计算的系统,我们必须引入按位存储信息的设备。存储设备都是由同一个时钟控制,时钟是一个周期性信号,决定什么时候要把新值加载到设备中。考虑两类存储器设备:
- 时钟寄存器(简称寄存器)存储单个位或字。时钟信号控制寄存器加载输入值。
- 随机访问存储器(简称存储器)存储多个字,用地址来选择该读或该写哪个字。随机访问存储器的例子包括:1)处理器的虚拟存储器系统,硬件和操作系统软件结合起来使处理器可以在一个很大的地址空间内访问任意字。2)寄存器文件,在此,寄存器标识符作地址。
Y86的顺序实现
实现所有Y86指令所需要的计算可以组织成六个基本阶段:
- 取指:取指阶段从存储器读取指令字节,地址为程序计数器(PC)的值。从指令中抽取出指令指示符字节的两个四位部分,称为icode(指令代码)和ifun(指令功能)。它可能取出一个寄存器指示符字节,指明一个和两个寄存器操作数指示符rA和rB。它还可能取出一个四字节常数valC。它按顺序方式计算当前指令的下一条指令的地址valP。也就是说,valP等于PC的值加上已取出指令的长度。
- 译码:译码阶段从寄存器文件读入最多两个操作数,得到值valA和/或valB。通常,它读入指令rA和rB字段指明的寄存器,不过有些指令是读寄存器%esp的。
- 执行:在执行阶段,算数/逻辑单元(ALU)要么执行指令指明的操作(根据ifun的值),计算存储器引用的有效地址,要么增加或减少栈指针。得到的值我们成为valE。在此,也可能设置条件码。对一条跳转指令来说,这个阶段会检查条件码和(ifun给出的)分支条件,看是不是应该选择分支。
- 访存:访存阶段可以将数据写入存储器,或者从存储器读出数据。读出的值为valM。
- 写回:写回阶段最多可以写两个结果到寄存器文件。
- 更新PC:将PC设置成下一条指令的地址。
遇到问题及解决
问题:
不清楚p263等HCL描述是怎么来的。
解决方法:
在博客园上提问,看书。
由教材p248页的集合关系对code in{2,3}的描述可知code in{......}语句的含义,在由p232的图4-2和P263图4-26对HCL和Y86的指令集的描述,即可理解HCL语言。
实验
验证教材上不少于三个HCL代码
运行Y86模拟器的命令语句:
验证asum.yo
验证asumi.yo
验证asumr.yo
参考资料
1.《深入理解计算机系统》第4章处理器体系结构
2.Y86模拟器安装教程:http://blog.csdn.net/hanchaoqi/article/details/40113801