教材学习内容总结
学习目标
- 了解ISA抽象的作用
- 掌握ISA,并能举一反三学习其他体系结构
- 了解流水线和实现方式
指令集体系统:一个处理器支持的指令和指令的字节级编码,每种不同的处理器都有自己不同的ISA
Y86指令集体系结构
定义一个指令集体系结构,包括定义各种状态元素,指令集和他们的编码、一组程序规范和异常处理。
- RF程序寄存器:%eax,%ecx,%edx,%ebx,%esi,%edi,%esp,%ebp(%esp被入栈、出栈、调用和返回指令作为栈指针)
- PC程序计数器:存放当前正在执行指令的地址
- DEME存储器:一个很大的字节数组,保存着程序和数据
- Stat程序状态:表明程序执行的总体状态
- CC条件码:ZF、SF、OF
Y86指令
字节
halt 0|0 1
nop 1|0 1
rrmovl rA,rB 2|0 |rA|rB 2
irmovl V ,rB 3|0 |F |rB|V 6
rmmovl rA,D(rB) 4|0 |rA|rB|D 6
mrmovl D(rB),RA 5|0 |rA|rB|D 6
OPL rA,rB 6|fn|rA|rB 2
JXX Dest 7|fn|Dest 5
cmovXX rA,rB 2|fn|rA|rB 2
call Dest 8|0 |Dest 5
ret 9|0 1
pushl rA A|0 |rA|F 2
popl rA B|0 |rA|F 2
- movl:头两个字母指定了源和目的格式,立即数(i),寄存器(r),存储器(m)
- 不允许从一个寄存器地址直接传送到另一个存储器地址,也不允许将立即数传送到存储器
- OPL是4个整数操作指令:addl,subl,andl,xorl。只对寄存器数据进行操作。
- JXX是7个跳转指令jmp,jle,jl,je,jne,jge和jg。根据分支指令的类型和条件码选额分支。
- cmovXX有6个条件指令:cmovle,cmovl.cmove,cmovne,cmovge,cmovg。这些指令格式与rrmovl一样,但只有当条件满足所需的约束时,才会更新目的寄存器的值
- call将返回地址入栈,然后跳到目的地址。
- ret指令从这样的过程调用中返回
- pushl和popl实现了入栈和出栈
- halt停止了指令的执行
指令编码
阅读指令编码看每条指令第一个字节表明指令的类型,高四位是代码部分,低四位是功能部分。
可能有附加的寄存器指示符字节,这些寄存器字段设为rA,rB。
有些指令需要附加一个四字节的常数字,和IA32一样,所有整数采用小端法编码
任意一个字节序列要么是一个唯一的指令编码,要么就不是一个合法序列
第一个字节有唯一的代码和功能组合,我们就可以决定多有其它发夹字节的长度和含义
Y86异常
值 名字 含义
1 AOK 正常操作
2 HLT 处理器执行halt指令
3 ADR 遇到非法地址
4 INS 遇到非法指令
ADR表示处理器试图从一个非法存储器地址读或者向一个非法存储器地址些
处理器通常会调用一个异常处理程序,这个过程被置顶用来处理遇到某种类型的异常
逻辑设计和硬件控制语言HCL
一个数字系统需要三部分组成:计算对位进行操作的函数的组合逻辑、存储位的存储器元素、以及控制存储器元素更新的时钟信号
逻辑门
逻辑门产生的输出等于他们输入位值的某个布尔函数
hcl表达式 AND && OR || NOT !!
组合电路:很多逻辑门组合成一张网,就能构成的计算块,构建这些网的两条限制 1. 两个或多个逻辑门的输出不能连接在一起 2. 这个网必须是无环的
c语言逻辑表达和hcl逻辑表达的区别 1. hcl输如会持续的影响输出,输入变化了,在一定的延迟后,输出也会变化。c只有在程序执行过程中被遇到时才会进行求值。 2. c的逻辑表达式允许参数是任意整数,0FALSE,其它值表示TRUE。逻辑值只对0和1进行操作
存储器和时钟
- 为了产生时序电路,必须引入按位存储信息的设备,存储设备由同一个时钟信号控制。
- 时钟寄存器:存储单个位或字,时钟信号控制寄存器加载输入值。
- 随机访问存储器:存储多个字,用地址来选择应该读写哪个字。
- 寄存器首先保持稳定(输出等于当前状态),时钟上升沿来到时,加载输入信号。
- 寄存器文件有两个读端口(A和B),一个写端口(W),允许同时进行多端口读写操作。
Y86顺序实现
将处理组织阶段
- 取值:取值阶段从存储器读取指令字节,地址委程序计数器的值,从指令中取出指令指示符字节的两个思维部分,称为icode(指令代码)和ifun(指令功能)。vaIP(下一条指令的地址)等于PC的值加上已取出指令的长度。
- 译码:从寄存器文件读入最多两个操作数,得到valA和/或valB。
- 执行:算数逻辑单元(ALU)执行指令指明的操作(根据ifun的值),计算存储器引用的有效地址,或者增加或减少栈指针。得到的值称为valE。也可能设置条件码。
- 访存:将数据写入存储器,或者从存储器读出数据。读出的值为valM。
- 写回:最多可以写两个结果到寄存器文件。
- 更新PC:将PC设置成下一条指令的地址。
Y86指令集的计算原则:处理器从来不需要为了完成一条指令的执行而去读由该指令更新了的状态。
SEQ阶段的实现 - 取值阶段包括指令存储器硬件单元。 - 译码和写会阶段:寄存器文件有四个端口。它支持同时进行两个读(A和B)和两个写(E和M)。每个端口都有一个地址链接和一个数据链接,地址谅解是一个寄存器ID,而数据连接是一组32根线路,既可以作为寄存器文件输出字(对读端口来说),也可以作为它的输入字(对写端口来说) - 访存阶段:读或者写程序数据,两个控制块产生存储器地址和存储器输入数据的值。另外两个块产生控制信号表明应该执行读还是写操作。当执行读操作时,数据存储器产生valM。 - 更新PC阶段:产生程序计数器的新值,依据指令的类型和是否要选择分支,新的PC可能是valC、valM或者valP。
教材学习中的问题和解决过程
在周四博客中,老师说安装Y86模拟器自己动手实践一下,于是我参考了同学的博客安装了Y86,这是我安装完成之后的Y86在pipe文件夹输入./psim -t -g ../y86-code/asum.yo
进入y86-code,生成asuml.yo
我试着将书上的代码敲了上去,然后输入以下命令
make clean
make 251pp.yo
之后就可以查看了
代码托管链接:http://git.oschina.net/Zziyang/CS04
学习进度条
代码行数(新增/累积) | 博客量(新增/累积) | 学习时间(新增/累积) | 重要成长 | |
---|---|---|---|---|
目标 | 5000行 | 30篇 | 400小时 | |
第二周 | 0/0 | 1/2 | 19/20 | |
第三周 | 80/80 | 1/3 | 25/44 | |
第四周 | 110/190 | 1/4 | 23/67 | |
第五周 | 60/250 | 2/6 | 26/93 | |
第六周 | 80/330 | 2/8 | 25/118 |