计算机系统结构 从挂科到满分【2】

第二章 指令系统设计

首先,指令系统是指令的集合,指令给软件提供功能,并且由硬件实现,就相当于软件请硬件干活,并提供 “你需要干什么” 和 “完成这件事所需要的数据”。

我们所说的对于指令系统的设计很大程度上就是对于指令格式的设计

1. 指令系统的分类

对于指令系统结构分类的重要依赖因素是CPU中用于存储操作数的存储单元的类型。

分为:堆栈,累加器,通用寄存器组(分为RM,RR型)

根据给出数据的方式,分为显式给出,隐式给出,所谓显式给出,就是根据指令字的操作数字段给出,隐式给出的意思是使用事先约定好的单元。

例子
表达式Z=X+Y在4种类型指令系统结构上的代码。
(前提不可以覆盖X,Y所在的存储空间)

堆栈 累加器 寄存器RM型 寄存器RR型
push X load X load R1,X load R1,X
push Y add Y add R1,Y load R2,X
add store Z store R1,Z add R3,R1,R2
pop Z store R3,Z

区别:

  • 对于堆栈型:把数读取用push,存用pop
  • 对于累加型,只需要加载一个数即可完成累加,这是依靠累加器本身的存储功能
  • 对于寄存器型RM,RM的特点是由一个数来自于M
  • 对于寄存器型RR,使用最多的指令,无论读,写都需要单独的寄存器保存

1.1 寄存器型指令集的分类

我们使用 (m,n) 表示指令中有n个操作数中有m个来自存储器的操作数。

  • 寄存器-寄存器(0,3):指令字长固定,每CPI相近,指令数多,目标代码不紧凑,程序占用的空间大
  • 寄存器-存储器(1,2):可以在ALU中对存储器的操作数进行引用,不必使用load指令(参考上面RM的代码),目标代码紧凑,但操作数不对称,CPI差异大。
  • 存储器-存储器(3,3):目标代码最紧凑,但指令字长变化很大,已经被淘汰

2. 寻址方式的设计

寻址方式设计就是指令系统中如何访问要访问数据的地址。

对于操作数本身而言,明确指向他的地址叫做有效地址EA

  • R[xx]:表示寄存器的内容,xx是地址
  • M[xx]:表示存储器的内容,xx是地址

寻址方式:

寻址方式 指令示例 含义
寄存器寻址 add r1,r2 R[r1]R[r1]+R[r2]R[r1]\leftarrow R[r1]+R[r2]
寄存器间接寻址 add r1,(r2) R[r1]R[r1]+M[R[r2]]R[r1]\leftarrow R[r1]+M[R[r2]]
存储器间接寻址 add r1,@(r2) R[r1]R[r1]+M[M[R[r2]]]R[r1]\leftarrow R[r1]+M[M[R[r2]]]
偏移寻址 add r1,120(r2) R[r1]R[r1]+M[R[r2]+120]R[r1]\leftarrow R[r1]+M[R[r2]+120]
直接寻址 add r1,(1010) R[r1]R[r1]+M[1010]R[r1]\leftarrow R[r1]+M[1010]
立即数寻址 add r1,#6 R[r1]R[r1]+6R[r1]\leftarrow R[r1]+6

立即数寻址方式偏移寻址方式的使用频度最高
大约1/4的load指令和ALU指令都用了立即数寻址

【问题1】:我们在指令中如何体现寻址方式呢?
有一种方法就是隐式指示(比如上面表格那种):
在这里插入图片描述
还有就是显式指示:
在这里插入图片描述
【问题2】:地址长度不一致,我们如何存放不同宽度的信息?
在这里插入图片描述
存储的时候一个信息不能跨存储边界。
我们选择对部分空间进行浪费,但是保证了访问速度。

假如一个存储字长:8字节如上,x表示可以任意
满足以下条件:

  • 字节的起始地址:x…xxxx
  • 半字的起始地址:x…xxx0
  • 单字的起始地址:x…xx00
  • 双字的起始地址:x…x000

3. 指令功能设计优化

指令的操作类型:

操作功能类型 实例
整型算术和逻辑运算 加减乘除与或反
数据传输 load store
控制 分支,跳转,返回,trap自陷,调用
浮点算术 加减乘除比较
字符串 移动,比较,搜索
图形 像素操作,压缩解压
系统 系统调用,虚存管理

3.1 控制指令

分支(条件),跳转,调用和返回

实现分支条件方法

  • 【条件码】:利用ALU操作设置的特殊位,比如CC位
  • 【条件寄存器】:利用比较指令把比较结果存入该寄存器,比较指令和分支指令是分开的
  • 【比较是分支指令的一部分】导致指令过长

实现跳转方法

  • 【偏移量法】由该偏移量和PC的值相加得到的目标地址

实现调用和返回的方法

  • 【链接寄存器】由于控制流发生改变,我们通常需要保存当前的机器状态,过去我们会使用专门的保存机制来保存机器状态,比如使用链接寄存器
  • 【load store】现在的指令系统会要求编译器生成load store来保存和恢复寄存器内容

3.2 指令操作码的优化

我们会考虑如何用最短的位数来表示指令的操作信息和地址信息。

比如使用哈夫曼编码,当事情概率不均等的时候,我们可以用短的编码来表示大概率事件,用长的编码来表示小概率事件。

构造哈夫曼树的方法:

  • 第一步:对事件的频率进行从小到大的排序
  • 第二步:每一次选择连个频率最小的节点加和出一个新的节点,不断重复以上两步。
    在这里插入图片描述
    操作码的优化程度可以用信息熵来表示:
    H=i=1npilog2piH=-\sum^n_{i=1}p_i*log_2p_i
    n 表示指令数量,pip_i表示每条指令的频度

每条指令的平均码长:
L=inpiliL=\sum_i^np_il_i

信息冗余量(比例):
μ=LHL100%\mu=\frac{L-H}{L}*100\%

例题:假设某模型机有7条指令,这些指令的使用频度如表所示:
在这里插入图片描述
计算该指令集的平均码长和信息冗余量。

解:
H=2.17
L=2.20
μ=2.202.172.20=1.36%\mu =\frac{2.20-2.17}{2.20}=1.36\%

【3/3/3拓展码】
每三位一个量级分开,好像十进制的数字表示方法一样,1-9一个位,现在1-8一个位(3个bit)

例题
在这里插入图片描述
解:

在这里插入图片描述

【定长操作码】
固定长度的操作码更多在RISC计算机上使用,可以减少译码的复杂度,以存储空间的代价来换取硬件的速度。
在这里插入图片描述

3.3 操作数的类型和大小

关于操作数的类型,可以在操作码里面给出,可以给数据本身加上数据类型标识

3.4 MIPS指令系统

MIPS指令系统是RISC的一种。

(1)MIPS的寄存器
32个64位的通用寄存器和32个浮点数寄存器
(2)寻址方式
立即数寻址和偏移量寻址,立即数字段和偏移量字段都是16位;寄存器间接寻址是用过0作为偏移量实现;存储器按字节寻址,地址64位
(3)指令格式
等长指令,32位。
操作码6位。

©️2020 CSDN 皮肤主题: 程序猿惹谁了 设计师: 上身试试 返回首页
实付0元
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、C币套餐、付费专栏及课程。

余额充值