第四章处理器体系结构 学习报告

第四章  处理器体系结构

4.1 Y86指令集体系结构

  定义一个指令集体系结构,例如Y86,包括定义各种状态元素、指令集和他们的编码、一组变成规范和异常事件处理。

4.1.1 程序员可见的状态

①程序员可见的状态:Y86中每条指令都会读取或修改处理器状态的某些部分。这里的“程序员”既可以是用汇编代码写程序的人,也可以是产生机器代码的编译器。

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

②存储器,从概念上来说是一个很大的字节数组,保存着程序和数据。Y86程序用虚拟地址来引用存储器位置。硬件和操作系统软件联合起来将虚拟地址翻译成实际或物理地址,指明数据实际保存在存储器那个地方。

4.1.2 Y86指令

Y86指令集基本上是IA32指令集的一个子集。它只包括四字节整数操作、寻址方式比较少、操作也较少。因为只有四字节数据,所以称之为“字”不会有任何歧义。

左边是指令的汇编码表示,右边是字节编码。汇编码格式类似于IA32的ATT格式。

4.1.3 指令编码

4.1.4 Y86异常

对于Y86,当遇到这些异常的时候,我们就简单的让处理器停业执行指令。

在更完整的设计中,处理器通常会调用一个异常处理程序,这个过程被指定用来处理遇到的某种类型的异常。

4.1.5 Y86程序

4.1.6 一些Y86指令的详情

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

4.2.1 逻辑门

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

组合电路:讲很多的逻辑门组成一个网,就能构成计算块。

构建这些网有两条限制:①两个或多个逻辑门的输出不能连接在一起,否则他们可能会使线上的信号矛盾,可能会导致一个不合法的电压或电器故障。

②这个网必须是无环的。

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

4.2.4 集合关系

4.2.5 存储器和时钟

4.3 Y86的顺序实现

4.3.1 将处理组织成阶段

下面是关于各个阶段以及各阶段内执行操作的简略描述:

  • 取指:取指阶段从存储器读取指令字节,地址为程序计数器(PC)的值。
  • 译码:译码阶段从寄存器文件读入最多两个操作数,得到val A/val B.
  • 执行:执行阶段,算术/逻辑单元要么执行指令明确的操作(根据ifun的值),计算存储器引用的有效地址,要么增加或减少栈指针。得到的值称为valE
  • 访存:访存阶段可将数据写入存储器或从存储器读出数据
  • 写回:最多可写两个结果到存储器。
  • 更新PC:将PC设置成下一指令的地址。

4.3.2 SEQ硬件结构

4.3.3 SEQ的时序

4.3.4 SEQ阶段的实现

 

4.4 流水线的通用原理

流水线化的一个重要特性就是增加了系统的吞吐量,也就是单位时间内服务的顾客总数,不过他也会轻微地增加延迟,也就是服务一个客户所需要的时间。

4.4.1  计算流水线

4.4.2  流水线操作的详细说明

4.4.3  流水线的局限性

  • 不一致的划分
  • 流水线过深,收益反而下降

 

4.4.4  带反馈的流水线系统

 

 

作业:

 

 

课后作业:2.90,2.82,3.55,3.62

2.90:

 

A: 格式    SEEEEEEE    EMMMMMMM    MMMMMMMM    MMMMMMMM 

pi的二进制数表示为:0 10000000 10010010000111111101011,

S: 为0,是个正数。 
      E:为 10000000  转为10进制为128,128-127=1,即实际指数部分为1. 
      M:为 10010010000111111101011。 这里,在底数左边省略存储了一个1,使用 实际底数表示为 1.10010010000111111101011 , 它表示的二进制小数值为:11.10010010000111111101011 

B.根据2.82,可知1/7的表示为0.001001[001]..., 所以22/7为11.001001001001001[001]... 

C.从第9位开始不同。

2.82

A. 

令x为无穷序列表示的值,可以得到

x*2^k = Y + x

所以

 x = Y/(2^k - 1)

 

B. (a) y=001,k=3,带入公式得:

x=1/7

(b) y=1001,k=4,带入公式得:

x=9/15 = 3/5

(c)y=000111,k=6,带入公式得:

x=7/63 = 1/9

 

 

 

3.55

大概算法如下: 

x的高32位为xh,低32位为xl。 

y的符号位扩展成32位之后为ys(ys为0或者-1)。 dest_h = (xl*ys)_l + (xh*y)_l + (xl*y)_h dest_l = (xl*y)_l

注意,所有的乘法都是unsigned*unsigned。 

也就是说对于 1*(-1),如果存入两个寄存器中,那么高32位是0,低32位是-1。  相当于 1*(UNSIGNED_MAX)。

 

3.62

M = 76/4 = 19;

 i在edi中,j在ecx中; 

int transpose(int M, int A[M][M]) { 

    int i,j;    

    for(i=0; i<M; ++i)     { 

        int *a = &A[i][0];        

 int *b = &A[0][i];        

 for(j=0; j<i; ++j)         { 

int t = *a;             

*a = *b;             

*b = t;            

 ++a;             

b += M;         

}    

 } 

 

 

 

 

posted on 2015-10-17 19:50  20135232  阅读(254)  评论(0编辑  收藏  举报