4.1Y86指令体系结构
程序员可见状态
ISA:
一个处理器支持的指令和指令的字节级编码称为~。
冒险:
一条指令的位置或者操作数依赖于其他仍在流水线中的指令。
程序员可见状态:
Y86程序中的每条指令都会读取或修改处理器状态的某些部分
=>只要我们保证机器级程序能够访问程序员可见状态,就不需要完全按照ISA隐藏方式来表示和组织这个处理器状态。
Y86的处理器状态类似于IA32。
有8个程序寄存器。处理器每个程序寄存器储存一个字。寄存器%esp被入栈,出栈,调用和返回指令作为栈指针。
有3个一位条件码:ZF,SF, OF.保存最近的算术或者逻辑指令所造成影响的有关信息。
程序计数器PC:存放当前正在执行指令的地址。
存储器:(概念上来说是一个很大的字节数组)保存着程序和数据。Y86程序用虚拟地址来引用存储器位置。
程序状态的最后一部分状态码Stat,表明程序执行总体状态。
Y86指令
只包括四字节整数操作,所以称之为“字 ”。
Y86指令集,长度1~6字节不等。一条指令含有一个单字节的指令表示符,可能含有一个单字节的寄存器指示符,还可能含有一个四字节的常数字。
字段fn:指明是某个整数操作(OPL),数据移动条件(comvxx)或是分支条件(jxx)。所有数值都使用16进制。
Y86指令的更多细节:
- movl指令分成了四个不同的指令irmovl,rrmovl,mrmovl和rmmovl。分别指明源(第一位)与目的(第二位)。源可以是立即数(i),寄存器(r)或存储器(m)。目的可以是寄存器(r)或存储器(m)。
两个存储器传送指令中的存储器引用方式是简单的基址和偏移量形式。
不允许存储器地址直接到另一个存储器地址的传送。也不允许将立即数传送到存储器。
- 有4个整数操作指令。(add1,sub1, and1, xor1)只对寄存器数据进行操作。这些指令会设置条件码(ZF,OF,SF)
- 7个跳转指令:(jmp,jle,jl,je,jne,jge,jg)
- 条件传送指令:(cmovle,cmovl,cmove,cmovne,cmovge和cmovg)
- call指令将返回地址入栈,然后跳转到目的地址。ret命令从这样的过程调用中返回。
- pushl,popl指令实现入栈和出栈。
- halt指令停止指令的执行。(IA32中的hlt类似)对Y86来说,执行halt指令会导致处理器停止。并将状态码设置为HLT
指令编码
每条指令的第一个字节表明指令的类型。这个字节分为两个部分:高4位是代码(code)部分,低四位是功能(function)部分。
8个程序寄存器中每个都用相应的0~7的寄存器标识符。
有的指令只有一个字节长,有些更长一些:
1.可能有附加的寄存器指示符字节。指定一个或两个寄存器。根据指令类型,可以指定数据源和目的寄存器,或是用于地址计算的基址寄存器。
2.附加4字节常数字。这个字能作为irmovl的立即数数据,rmmovl和mrmovl的地址指示符的偏移量,以及分支指令和调用指令的目的地址。
*注意分支指令与调用指令的目的地址是一个绝对地址。
指令集的一个重要性质就是字节编码必须有唯一的解释=>保证处理器可以无二义性地执行目标代码程序。
Y86异常
状态码Stat的可能状态:
当遇到异常时(1以外其他):
调用异常处理程序:指定用来处理遇到的某种类型的异常。
Y86程序
命令:指明应该将代码或数据放在什么位置,以及如何对对齐。
p239:以“.”开头的是汇编器命令。告诉汇编器调整地址,以便在那里产生代码或插入一些数据。
一些Y86指令详情
pushl指令会把栈指针减4,并将一个寄存器值写入存储器中。
通常有两种约定:
1)压入%esp的原始值。
2)压入减去4的%esp的值。
4.2逻辑设计和硬件控制语言HCL
一个数字系统需要三个主要的组成部分:
计算对位进行操作的函数的组合逻辑存储位的存储器元素控制存储器元素更新的时钟信号。
逻辑门
组合电路和HCL布尔表达式:
将很多逻辑门组成一个网,就能构建计算块,称为组合逻辑电路。
构建这些网有两条限制:
多个逻辑门的输出不能连在一起(可能会使线上的信号矛盾,导致不合法电压或电路故障)网必须是无环的,网中不能有路径经过一系列的门而形成一个回路(可能导致网络计算函数有歧义)
多路复用器(MUX):根据输入控制信号的值,从一组不同的数据信号中选出一个。
*输入信号a,b,控制信号c
bool out = (s && a) || (!s && b);
字级的组合电路和HCL整数表达式
多路复用函数是用情况表达式来描述的:
[select_1 : expr_1;select_2 : expr_2;...select_k : expr_k;]
从逻辑上来讲这些选择表达式是顺序求值的,且第一个求值为1 的情况会被选中。
*允许不互斥表达式使得HCL代码的可读性更好。
集合关系
判断集合关系的通用格式是:
iexpr in {iexpr1,iexpr2, ... ,iexprk}
这里被测试的值iexpr和待匹配的值iexpr1~iexprk都是整数表达式。
存储器和时钟
存储设备都是同一个时钟控制,时钟是一个周期性信号,决定什么时候把新值加载到设备中。
两类存储器设备:
时钟寄存器:存储单个位或字。时钟信号控制寄存器加载输入值。
随机访问存储器:存储多个字,用地址来选择该读或者写哪个字。
硬件寄存器:寄存器直接将输入和输出线连接到电路的其他部分。
程序寄存器:寄存器代表CPU中为数不多的可寻址的字,这里的地址是寄存器ID。
Y86处理器会用时钟寄存器保存程序计数器(PC),条件代码(CC)和程序状态(Stat)
4.3 Y86的顺序实现
将处理组织成阶段
各个阶段:
- 取指:从存储器读取指令字节,地址为程序计数器PC。
- 译码:从寄存器文件读人最多两个操作数,得到值valA和/或valB。
- 执行:ALU要么执行指令指明的操作,计算存储器引用的有效地址,要么增加或减少栈指针。
- 访存:可以将数据写入存储器,或者从存储器读出数据。
- 写回:最多可以写两个结果到寄存器文件。
- 更新PC:将PC设置到下一条指令的地址。
SEQ硬件结构
SEQ中,所有的硬件单元的处理都在一个时钟周期内完成。
SEQ的时序
SEQ的实现包括组合逻辑和两种存储器设备:
时钟寄存器(程序计数器和条件码寄存器)
随机访问存储器(寄存器文件,指令存储器和数据存储器)
要控制处理器的活动的时序,只需要寄存器和存储器的时钟控制。
所用状态的更新实际上同时发生,且只在时钟上升开始下一个周期时。
能够保证这样的等价性,是由于Y86指令集本质,遵循以下原则组织计算:
处理器从来不需要为了完成一条指令的执行而去读由该指令更新了的状态。
SEQ阶段的实现
1.取指阶段
取指阶段包括指令存储器硬件单元
信号instr_vaild和imem_error在访问阶段被用来产生状态码。
2.译码和写回阶段
指令字段译码,产生寄存器文件使用的四个地址的寄存器标识符。
3.执行阶段
包括算数/逻辑单元(ALU)。这个单元根据alufun信号设置,对输入aluA和aluB执行ADD,SUBTRACT,AND,EXCLUSIVE-OR运算。
4.访存阶段
任务是读或者写程序数据。
5.更新PC阶段
会产生程序计数器的新值。
作业:
参考资料
1.http://group.cnblogs.com/topic/73168.html
2.http://www.cnblogs.com/javajy/ (用了几张图片=///=)
3.《深入理解计算机系统》