第四章:处理器体系结构
ISA指令集体性结构——处理器支持的指令和指令的字节编码
HCL硬件控制语言—描述处理器设计
Y86——定义一个指令集体系结构,包括定义各种状态元素、指令集和他们的编码、一组编程规范和异常事件处理。
一、Y86指令集体系结构
(一)程序员可见的状态
1.Y86程序
每条指令都会读取或修改处理器状态的某些部分
2.程序员
可以是用汇编代码写程序的人,也可以是产生机器级代码的编译器。
3.处理器状态(类似于IA32)
①8个程序寄存器,%eax,%ecx,%edx,%ebx,%esi,%edi,%esp,%ebp
②处理器的每个程序寄存器存储一个字
③寄存器%esp被入栈、出栈、调用和返回指令作为栈指针。在其他情况下,寄存器没有固定的含义或固定值。
④有三个一位的条件码:ZF,SF,OF,它们保存最近的算术或洛基指令所造成英雄的有关信息。
***Y86程序可以用来访问和修改程序寄存器,条件码,程序计数器(pc)和存储器
*** 状态码指明程序是否运行正常后者发生了某个特殊事件
4.存储器
Y86程序用虚拟地址来引用存储器位置,硬件和操作系统软件联合起来将虚拟地址翻译成实际或物理地址
指明数据实际保存在存储器那个位置
5.状态码stat
它表明程序执行的总体状态,会指示是正常运行还是出现了某种异常。
(二)Y86指令
Y86指令集基本上是IA32指令集的一个子集
1.四种movl指令
irmovl,rrmovl,mrmovl,rmmovl
格式:指令 源操作数 目的操作数。
(1)源操作数可以是立即数i、寄存器r、存储器m
(2)目的操作数可以是寄存器和存储器
特别注意:**这里的存储器引用方式是简单的基址和偏移量形式,寻址方式不支持第二变址寄存器和任何寄存器值的伸缩
****两个操作数不能都是来自存储器,也不允许将立即数传送到存储器
2.四个整数操作指令
addl subl andl xorl
只对寄存器数据进行操作(IA32允许对存储器数据进行这些操作)。
指令会设置三个条件码:ZF零 SF符号 OF溢出
3.七个跳转指令
jmp 、 jle 、jl 、jne 、jge 、jg
(见书本图3-12)
4.六个条件传送指令
cmovle、cmovl、cmove、cmovne、cmovge、cmovg
这些指令的格式与寄存器-寄存器传送指令rrmovl一样,但是只有当条件码满足所需要的约束时,才会更新目的寄存器的值。
5.call和ret
call指令将返回地址入栈,然后跳到目的地址
ret指令从这样的过程调用中返回。
6.pushl和popl:实现入栈和出栈
7.halt指令
与IA32的hlt指令类似,但是IA32的应用程序不允许使用这条指令,因为它会导致整个系统暂停运行
对于Y86来说,halt指令停止指令的执行,执行此指令会导致处理器停止,并将状态码设置为HLT。
(三)指令编码
1.字节级编码
每条指令表明指令的类型,每部分四位,分为两部分
高四位为代码部分,低四位为功能部分
当需要指明不应访问任何寄存器时,用ID值0xF表示
2.额外的字节
指定一个或两个寄存器,例如rA或者rB
没有寄存器操作数的指令,例如分支指令和call指令,就没有寄存器指示符字节。
只需要一个寄存器操作数的指令(irmovl,pushl,popl)将另一个寄存器指示符设为0xF
3.附加的4字节常数字
irmovl的立即数数据2.rmmol和mrmovl的地址指示符的偏移量3.分支指令和调用指令的目的地址
注意事项
分支指令和调用指令的目的地址是一个绝对地址
所有整数采用小端法编码
(四)Y86 异常
1.状态码Stat取值:Stat描述程序执行的总体状态
值 |
名字 |
含义 |
1 |
AOK |
正常操作 |
2 |
HLT |
处理器执行halt命令 |
3 |
ADR |
遇到非法地址 |
4 |
INS |
遇到非法指令 |
注意:Y86 出现异常时,会让处理器体制执行命令;调用异常处理机制
(五)Y86程序
(1)Y86代码和I32代码的多条指令主要区别在于:Y86需要多条指令来执行一条I32指令所完成的功能
(2)命令指明应该将代码或数据放在什么位置,以及该如何对齐
(3)以“.”开头的是汇编器命令
(4)创建Y86代码的唯一工具是汇编器,所以程序员必须执行本来通常交给编译器、链接器和运行时系统来完成的任务。
详细参考书本:1、P237-238图4-6的IA32和Y86汇编代码
2、p239-240图Y86汇编代码编写和YAS汇编器的输出的例子(YIS指令集模拟器)
(六)一些Y86指令的详情
在压入/弹出栈指针%esp的时候,popl和pushl有两种不同的约定:
1.压入/弹出%esp的原始值
2.压入/弹出%esp-/+4后的值
二、逻辑设计和硬件控制语言HCL
电子电路中,用1.0V左右的高电压表示逻辑1,用0.0V左右的低电压表示逻辑0.
(一)逻辑门
1.逻辑门产生的输出:等于它们输入位值的某个布尔函数。
2.对应的HCL表达式:
AND 用&&表示
OR 用||表示
NOT 用!表示
3.注意:逻辑门只对单个位的数进行操作,而不是整个字。
逻辑门总是活动的,输入变化输出很快就跟着变化。
参考C语言中运算符(2.1.9节)
(二)组合电路和HCL布尔表达式
1.构建计算块(称为组合电路)的限制
①两个或多个逻辑门的输出不能连接在一起
②必须无环
2.组合逻辑电路和c语言中逻辑表达式的区别
①组合电路的输出会持续响应输入变化,c语言表达式只有在执行过程中被遇到才求值
②逻辑门只对0和1操作,c语言表达式中参数可以是任意整数,0是FALSE,不是0的都是TRUE
③C 的逻辑表达式有个属性就是他们可能只被部分求值
(三)字级的组合电路和HCL整数表达式
1.关于HCL的几点说明
HCL中所有字级的信号都声明为int;
在画字级电路的时候,用中等粗度的线表示携带字的每个位的线路,用虚线来表示布尔信号的结果
在HCL中,表示默认情况(即所有条件都没有被选中的情况)一般用1
2.多路复用函数的情况表达式描述
[
select_1 : expr_1
select_2 : expr_2
.......
select_k : expr_k
]
从逻辑上讲,这些选择表达式是顺序求值的。
(四)集合关系
判断集合关系的通用格式是:
iexpr in {iexpr1,iexpr2,...,iexprk}
注意:被测试的值iexpr和带匹配的值iexprk等都是整数表达式
(五)存储器和时钟
时序电路两类存储器设备:
(1)时钟寄存器(简称寄存器):储存单个位或字。时钟信号控制寄存器加载输入值
(2)随机访问储存器(简称储存器):储存多个字,用地址选择该读或写哪个字
三.Y86的顺利实现
SEQ顺序处理器:实现一个高效的、流水线化的处理器
(一)将处理组织成阶段
1.基本阶段:
- 取指
- 译码
- 执行
- 访存
- 写回
- 更新PC
不同Y86指令在各个阶段的处理:
(1)Y86指令针对OPl(整数和逻辑运算),rrmovl(寄存器-寄存器传送)和irmovl(立即数-寄存器传送)在顺序实现中的计算
- 其他指令详细内容见书250页-257页
(二)、SEQ硬件结构
硬件单元是与各个处理阶段相关联,有六个基本阶段(详细看p258-259)
(三)SEQ的时序
(1)要控制处理器中活动的时序,只需要寄存器和存储器的时钟控制
(2)除了指令存储器只用来读指令故而可以看作组合逻辑之外,剩余的程序计数器、条件码寄存器、数据存储器和寄存器文件需要通过一个时钟信号来控制(控制时序)
(3)每个时钟周期内,程序计数器都会装载新的指令地址;只有执行整数运算指令的时候,才会装载条件码寄存器。只有执行rmmovl,pushl,call时,才会写数据存储器。
(4)Y86指令集的本质遵循这样一项组织原则:处理器从来不需要为了完成一条指令的执行而去读由该指令更新了的状态
(四)SEQ阶段的实现
HCL描述中使用的参数值(这些值表示的是指令参数、功能码、寄存器ID、ALU操作和状态码 的编码)
nop指令:只是简单地经过各个阶段,除了PC+1,不进行任何处理
halt指令:使处理器状态被设置为HLT,导致处理器停止运行
1.取指阶段
2.译码和写回阶段
根据四个端口的情况,判断应该读哪个寄存器产生信号valA、valB
3.执行阶段
(1)包括算术/逻辑单元ALU,输出的是valE。
ALU常被用作加法器
(2)包括条件码寄存器
零,符号,溢出,产生信号set_cc
4.访存阶段
任务:读或者写程序数据。
两个数据块产生存储器地址和存储器输入证据的值,两个产生控制信号表明应该是读还是写。
5.更新PC阶段
最后一个阶段会产生程序计数器的新值
实验
构建YIS环境:
cd ~/Code/shiyanlou_cs413
wget http://labfile.oss.aliyunce.com/courses/413/sim.tar
tar -xvf sim.tar
cd sim
sudo apt-get install tk
sudo ln -s /usr/lib/x86_64-linux-gnu/libtk8.6.so /usr/lib/libtk.so
sudo ln -s /usr/lib/x86_64-linux-gnu/libtk8.6.so /usr/lib/libtk.so
YIS测试:
cd y86-code
进入测试代码,教材p239页代码为asuml.ys,可以通过
make asuml.yo
进行汇编,asuml.yo就是汇编后的结果,见教材p238。
make all
可以汇编运行所有代码结果。
参考资料
1.《深入理解计算机系统》教材第四章《处理器体系结构》
2.https://www.shiyanlou.com/courses/413 实验楼《深入理解计算机系统》实验五——处理器体系结构
3.https://www.shiyanlou.com/courses/413 实验楼《深入理解计算机系统》实验四——程序的机器级表示(复习)
4.信息安全系统设计基础@BESTI小组博客园:20135313吴子怡实验楼实验五YIS构建操作问题 http://group.cnblogs.com/103791/
5. IA32 and x86-64 Documentation和Y86 Tools