ISA:指令集体系结构——一个处理器支持的指令和指令的字节级编码。
HCL:硬件控制语言——一种描述硬件系统控制部分的简单语言。
寄存器:8个,每一个寄存器可以存储一个字,也就是一个32位二进制。
条件码:一个一位二进制的寄存器,保存着最近的算术或逻辑运算所造成的影响的信息。
PC:程序计数器,记录当前正在执行的指令的地址。
存储器:很大的字节数组,保存着程序和数据,用虚拟地址来访问存储器,硬件和操作系统会将虚拟地址翻译为实际的(或物理)地址。
状态码:stat表明程序执行的总体状态(正常还是出现某种异常)。
xxmovl:数据传送指令,其中r代表寄存器,m代表存储器,i代表立即数。比如rrmovl指令,则代表将一个寄存器的值,赋给另外一个寄存器。
*不允许:存储器地址直接传给存储器地址;立即数传给存储器。
opl:操作指令,只对寄存器数据进行操作,设置三个条件码zf、sf、of。
jxx:条件跳转指令,根据分支指令类型和条件码设置进行跳转。
cmovxx:条件传送指令,后面的xx代表的是条件。
*只发生在两个寄存器之间,不会将数据传送到存储器。
call:将返回地址入栈,并跳到目标地址。
ret:将返回地址入PC,并跳到返回地址。
push与pop:入栈和出栈操作。
halt:终止指令的执行。
*处理器停止,并将状态码设置成HLT。
每条指令的第一个字节表明指令的类型:(功能值只有在一组相关指令共用一个代码时才有用)
高4位:代码部分(例:6是整数操作)根据指令类型,1.指令可指定用于数据源和目的寄存器;2.用于地址计算的基址寄存器。
call:没有寄存器操作数,就没有寄存器指示符字节。当需要一个附加的4字节常数字。这个字可作为:1.irmovl的立即数;2.rmmovl、mrmovl的地址指示符偏移量;3.分支指令、调用指令的目的地址(绝对地址)。
1:AOK,正常操作
2:HLT,处理器执行halt指令
3:ADR,遇到非法地址
4:INS,遇到非法指令
遇到异常,处理器停止执行指令。
Y86需要多条指令来执行一条IA32指令完成的功能。
Y86没有伸缩寻址模式。
YIS:指令集模拟器,目的是模拟Y86机器代码程序的执行。
HCL:硬件控制语言,描述不同处理器设计的控制逻辑。
1.HCL表示与、或、非:a&&b、a||b、!a。每个门产生的输出等于他输入的某个布尔函数。
2.将很多逻辑门组合成一个网,就能构建计算块,称为组合电路。
限制:1.两个及以上逻辑门的输出不能连接在一起(会产生信号矛盾)。
2.网必须是无环的,不可以有路径经一系列门而形成回路。
如:检测位相等:bool eq=(a&&b)||(!a&&!b);
3.MUX:多路复用器,根据输入控制信号的值,从一组不同的数据信号中选出一个。
如:bool out=(s&&a)||(!a&&b);(s是控制信号)
4.组合逻辑电路和C语言中逻辑表达式区别:
组合电路:逻辑门组成;输出会持续响应输入变化;只对0、1进行操作。
C语言逻辑表达式:只在程序执行过程中遇到时进行求值;允许参数是任何数;可能只被部分求值,如果第一个参数可以确定值,第二个参数就不用操作了。
5.多路复用函数用情况表达式。格式:
[
s_1:e_1
s_2:e_2
...
s_k:e_k
1:无情况,则选这。
]
*s_i:布尔表达式,指明何时该选;e_i:整数表达式,得到的值。
6.选择表达式:可任意布尔表达式,使得情况表达式能描述带复杂选择标准的、多种输入信号的块。
(关于逻辑门的知识同上学期学的EDA很类似)
7.ALU:算术/逻辑单元,一种很重要的组合电路,这个电路有三个输入:两个数据输入及一个控制输入。
寄存器是作为电路不同部分中的组合逻辑之间的屏障。每当每个时钟到达上升沿时,值才会从寄存器的输入传送到输出。
取指
从存储器读取指令字节,放到指令存储器(CPU中)中,地址为程序计数器(PC)的值。
按顺序的方式计算当前指令的下一条指令的地址(即PC的值加上已取出指令的长度)
从寄存器文件读入最多两个操作数。读入指令rA、rB字段指明的寄存器。
根据指令的类型,将算数/逻辑单元(ALU)用于不同的目的。
计算增加或减少栈指针;
计算有效地址;
只是简单地加0,将一个输入传递到输出;
也可能设置条件码;
将数据写入存储器;或从存储器读出数据。
数据存储器(CPU中)读出或写入一个存储器字。指令和数据存储器访问的是相同的存储器位置,但是用于不同的目的。
最多可以写两个结果到寄存器文件。
寄存器文件有两个写端口。端口E用来写ALU计算出来的值,而端口M用来写从数据存储器中读出的值。
将PC设置成下一条指令的地址。
1.SEQ的实现包括:组合逻辑和两种存储器设备
时钟寄存器:程序计数器、条件码寄存器
随机访问存储器:寄存器文件、指令存储器、数据存储器
2.需要用时序进行明确控制:程序计数器、条件码寄存器、寄存器文件、数据存储器。
3.每个时钟周期,程序计数器都会装载新的指令地址。
只有在执行整数运算指令时,才会装载条件码寄存器。
只有在执行mov、push、call指令时,才会写数据存储器。
解决:在练习题中实践。
以练习题1为例.如irmovl $15,%ebx
irmovl:i表示立即数,r表示寄存器;即是将一立即数付给寄存器。
由ir可知:第一个字节:30
由$15可知:不访问任何寄存器,指示符字节F。
由%ebx可知:指示符字节3。
根据小端法,将15的十六进制反向写开为0f 00 00 00
因此,该句的字节编码是30f30f000000。
解决:在练习题中实践。
以练习题2为例.如0x100:30f3fcffffff/406300080000/00(/自己划分的)分三块
第一块30f3fcffffff
30:irmovl(6字节,下一个地址偏移量是6,所以下一个地址是0x106;6字节,所以划分到4前面)
f:立即数
3:%ebx
fcffffff:(小端法)反向写为fffffffc,即是-4
第二块406300080000(分析方法同第一块)
*第三块00,即是halt停止
故,本条指令前的地址偏移量是依据上一条指令所占字节确定的。
总结:关于Y86指令,主要通过练习题4.1和4.2,学会看书上的图4-2,4-3,4-4。
解决:看课本,做练习。
1.如课本图4-18第二列:rrmovl rA,rB
valE<——0+vlaA
*分析:不需要取第二个寄存器操作数,将第二个输入设为0,把它和第一个操作数相加,得到valE=0+valA=valA
2.如练习题4.11:irmovl $128,%esp
valE<——0+128=128
*分析:和rrmovl处理方式类似。
解决:参考了网络达人的博客[2],并反复读书,联系第一节的知识。
已取指令长度:指令所占字节编码,即是字节数。
如rrmovl rA,rB
valP<——PC+2(分析:rrmovl指令长度2字节,所以+2)
总结:Y86顺序实现这节内容其实是将第一节练习题,如何做,怎么想,即做题思路进行计算机内部操作阶段的讲述。
我的理解(根据对各阶段的功能描述):
译码:从寄存器文件读入。
如irmovl指令,立即数寻址,用不到寄存器,所以不用译码阶段。
访存:写入或读出数据从存储器。
如rmmovl指令,需要将寄存器值valA写到存储器,或从存储器中读出valM,所以经历访存阶段。
实验
构建YIS环境:
YIS测试:
参考资料
[1]《深入理解计算机系统》
[2]http://blog.csdn.net/yang_yulei/article/details/22529437
[3]http://group.cnblogs.com/topic/73168.html