学习计时:共13小时

读书:5

代码:2

作业:3

博客:3

 

第四章处理器体系结构

 

一个处理器支持的指令和指令的字节级编码称为它的指令集体系结构。

处理器可以同时执行五条指令的不同阶段。

冒险就是一条指令的位置或操作数依赖于其他仍在流水线中的指令。

4.1 Y86指令集体系结构

定义一个指令集结构。

4.1.1程序员可见的状态

Y86每条指令都会读取或修改处理器状态的某些部分,称为程序员可见状态。

Y86的处理器状态类似IA32。有8个程序寄存器:%eax , %ecx , %edx , %ebx , %esi , %edi , %esp , %ebp。

寄存器%esp被出栈、入栈、调用和返回指令作为栈指针。在其他情况下,寄存器没有固定的含义或固定值。

有三个一位的条件码:ZF,SF,OF,它们保存最近的算术或洛基指令所造成英雄的有关信息。

程序计数器PC存放当前正在执行指令的地址。

Y86程序用虚拟地址来引用存储器位置,硬件和操作系统软件联合起来将虚拟地址翻译成实际或物理地址。

状态码stat表明程序执行的总体状态,会指示是正常运行还是出现了某种异常。

4.1.2 Y86指令

Y86指令集基本上是IA32指令集的一个子集,只包括四字节整数操作,寻址方式比较少,操作也较少。

IA32的movl指令分为四种不同的指令:irmovl,rrmovl,mrmovl,rmmovl。分别显示地指明源和目的的格式。

源操作数可以是 i-立即数 、 r-寄存器 、 m-存储器。

目的操作数可以是 r-寄存器 、 m-存储器。

两个存储器传送指令中的存储器引用方式是简单的基址和偏移量形式,在地址计算中不支持第二变址寄存器和任何寄存器值的伸缩。

  四个整数操作指令: addl 加   subl 减   andl 与   xorl 异或。它们只对寄存器数据进行操作(区别于IA32,后者还允许对存储器数据进行这些操作)。

  这些指令会设置三个条件码: ZF-零   SF-符号   OF-溢出。

  七个跳转指令:jmp  、  jle  、  jl   、  je  、  jne  、  jge  、  jg 。

  六个条件传送指令: cmovle 、 cmovl 、 cmove 、 cmovne 、 cmovge 、 cmovg。这些指令的格式与寄存器-寄存器传送指令rrmovl一样,但是只有当条件码满足所需要的约束时,才会更新目的寄存器的值。

  call指令将返回地址入栈,然后跳到目的地址,ret指令从这样的过程调用中返回。

  pushl和popl实现入栈和出栈。

  halt指令停止指令的执行,执行此指令会导致处理器停止,并将状态码设置为HLT。

4.1.3 指令编码

每条指令需要1-6个字节不等,每条指令的第一个字节表明指令的类型。

每条指令的第一个字节表明指令的类型。这个字节分为两个部分,每个部分4位:高四位:代码部分,低四位:功能部分。

8个程序寄存器中每个都有相应的0~7的寄存器标识符,程序寄存器存在CPU中的一个寄存器文件中,这个寄存器文件就是一个小的、以寄存器id作为地址的随机访问存储器。

可能有附加的寄存器指示符字节

指定一个或两个寄存器,例如rA或者rB。根据指令类型,指令可以指定用于数据源和目的的寄存器,或用于地址计算的基址寄存器。

有的指令附加的4字节常数字,这个字的能作为irmovl的立即数数据,rmmol和mrmovl的地址指示符的偏移量以及分支指令和调用指令的目的地址。

指令集的重要性质:字节编码必须有唯一的解释。

4.1.4 Y86异常

状态码Stat的可能取值见书237页。

Y86遇到异常时就简单让处理器停止运行指令。处理器会调用一个异常处理程序。

4.1.5 Y86程序

Y86有时需要两条指令来完成IA32一条指令就能完成的事。

Y86没有伸缩寻址模式。

以“.”开头的是汇编器命令。

创建Y86代码的唯一工具是汇编器,所以程序员必须执行本来通常交给编译器、链接器和运行时系统来完成的任务。

4.1.6 一些Y86指令的详情

pushl在不同的x86模型之间有歧义,但是popl没有。

 

4.2 逻辑设计和硬件控制语言HCL

在硬件设施中,用电子电路来计算对位进行运算的函数。

用1.0V左右的高电压表示逻辑1,用0.0V左右的低电压表示逻辑0。

4.2.1 逻辑门

逻辑门产生的输出,等于它们输入位值的某个布尔函数。

AND   &&

OR     ||

NOT    !

逻辑门只对单个位的数进行操作,而不是整个字。

逻辑门总是活动的,输入变化输出很快就跟着变化。

4.2.2 组合电路和HCL布尔表达式

将很多的逻辑门组合成一个网,就能构建计算块,称为组合电路。

构建这些网有两条限制:

  两个或多个逻辑门的输出不能连接在一起。

  必须无环。

组合逻辑电路和c语言中逻辑表达式的区别:

  组合电路的输出会持续响应输入变化,c语言表达式只有在执行过程中被遇到才求值。

  逻辑门只对0和1操作,c语言表达式中参数可以是任意整数,0是FALSE,不是0的都是TRUE。

  c的逻辑表达式可能被部分求值。

4.2.3 字级的组合电路和HCL整数表达式

多路复用函数是用情况表达式来描述的。

4.2.4 集合关系

判断集合关系的通用格式是:

iexpr in {iexpr1,iexpr2,...,iexprk}   iexpr等都是整数表达式。

4.2.5 存储器和时钟

时钟寄存器(简称寄存器):储存单个位或字。

随机访问储存器(简称储存器):储存多个字,用地址选择该读或写哪个字。

寄存器分为“硬件寄存器”和“程序寄存器”。

寄存器文件有两个读端口和一个写端口。

一个多端口随机访问存储器允许同时进行多个读和写的操作。

 

4.3  Y86的顺序实现

SEQ处理器

4.3.1 将处理组织成阶段

  取指:从存储器读取指令字节,地址为程序计数器(PC)的值。指令指示符字节两个四位部分,称为icode(指令代码)和ifun(指令功能)。vaIP(下一条指令的地址)=PC+已取出指令的长度。

  译码:从寄存器文件读入最多两个操作数,得到valA和/或valB。

  执行:算数逻辑单元(ALU)根据ifun的值执行指令指明的操作,计算存储器引用的有效地址,或者增加或减少栈指针。得到的值称为valE。也可根据条件码执行跳转。

  访存:将数据写入存储器,或者从存储器读出数据。读出的值为valM。

  写回:最多可以写两个结果到寄存器文件。

  更新PC:将PC设置成下一条指令的地址。

4.3.2 SEQ硬件结构

 

 

  取指:将程序计数器寄存器作为地址,指令存储器读取指令的字节。PC增加器计算valP,即增加了的程序计数器。

  译码:寄存器文件有两个读端口A和B,从这两个端口同时读寄存器的值valA和valB。

  执行:根据指令类型将算数/逻辑单元(ALU)用于不同的目的。条件码寄存器有三个条件码位,ALU负责计算条件码的新值,当执行跳转指令时会根据条件码和跳转类型来计算分支信号Cnd。

  访存:数据存储器读出或写入一个存储器字。指令和数据存储器访问的是相同的存储器位置,但用于不同的目的。

  写回:寄存器文件有两个写端口,E用来写ALU计算出来的值,M用来写从数据存储器中读出来的值。

 

SEQ抽象视图的画法:

  程序计数器放在寄存器中,位于左下角PC。

  信息随着线流动,方向是先向上再向右

  反馈先祖在右边向下

  所有硬件单元的处理都在一个时钟周期内完成。

  浅灰色方块表示硬件单元

  控制逻辑块是用灰色圆角矩形表示的

  线路的名字在白色椭圆中说明

  宽度为字长或更窄的数据连接用细线

  单个位的连接用虚线

4.3.3 SEQ的时序

SEQ的实现包括组合逻辑和两种存储器设备:

  时钟寄存器——程序计数器和条件码寄存器。

  随机访问存储器——寄存器文件、指令存储器和数据存储器。

每个时钟周期,程序计数器都会装载新的指令地址。

只在执行整数运算指令时才会装载条件码寄存器。

只在执行rmmovl、pushl或call时写入数据存储器。

两个写端口允许每个时钟周期更新两个程序寄存器。特殊寄存器ID 0xF表示此端口不应执行写操作。

Y86指令集下的组织原则:处理器从来不需要为了完成一条指令的执行而去读由该指令更新了的状态。

4.3.4 SEQ阶段的实现

取指阶段:包括指令存储器硬件单元。

译码和写回阶段:寄存器文件,支持同时进行两个读和两个写,每个端口有一个地址连接(寄存器ID)和一个数据连接(32根线路),既可以作为寄存器文件的输出字,又可以作为他的输入字。

执行阶段:算数逻辑单元(ALU),输出为valE信号。

访存阶段:读或者写程序数据,两个控制块产生存储器地址和存储器输入数据的值。另外两个块产生控制信号表明应该执行读还是写操作。当执行读操作时,数据存储器产生valM。

更新PC阶段:产生程序计数器的新值,依据指令的类型和是否要选择分支,新的PC可能是valC、valM或者valP。

 

实验楼实验

1.构建YIS环境:

  cd ~/Code/shiyanlou_cs413

  wget http://labfile.oss.aliyuncs.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

  make

2.YIS测试:

cd y86-code

进入测试代码,教材p239页代码为asuml.ys,可以通过

make asuml.yo
进行汇编,asuml.yo就是汇编后的结果,见教材p238。
make all

 

 

学习感受

  这周内容相比以往少了一些感觉相对轻松了一点,但是大量的汇编内容对我们没有学过汇编的人来说还是不小的挑战。拿着课后练习题也只能对着答案理解思考或者慢慢的推过程。

参考资料

闫佳歆博客的SEQ抽象视图的画法部分,总结得比书上更详细。

教材《深入理解计算机系统》

教材《汇编》

posted on 2015-10-15 11:42  20135231  阅读(166)  评论(0编辑  收藏  举报