# 第二章:指令系统设计
# 2.1 结构分类
堆栈结构、累加器结构、通用寄存器结构
Z = X + Y 的三种实现:
(1) 堆栈结构:
不能随机访问,难以高效实现
push x | |
push y | |
add | |
pop z |
(2) 累加器结构:
累加器是一种寄存器,专门存放算术或逻辑运算的一个操作数和运算结果;存储器开销最大
load x | |
add y | |
store z |
(3) 通用寄存器结构:
形式一:寄存器 - 存储器结构,访问慢
load R1, x | |
add R1, y | |
store R1, z |
形式二:寄存器 - 寄存器结构,访问快,灵活
load R1, x | |
load R2, y | |
add R3, R1, R2 | |
store R3, z |
RR 结构也称为 load-store 结构,所有操作数都是来自通用寄存器组,是现代指令系统结构的主流
# 2.2 寻址方式
信息存储的整数边界概念:信息在主存中存放的起始地址必须是该信息宽度(字节数)的整数倍
存储效率 = 整个数据所需的存储量 / 整个数据所占的存储量
将寻址方式编码于操作码中,由操作码描述相应操作的寻址方式,适合处理机采用 load-store 结构
七种基本寻址方式:
- 立即数寻址: 立即数 > 寄存器
- 直接寻址: [偏移地址] > 寄存器
- 寄存器寻址: 寄存器 > 寄存器
- 寄存器间接寻址: [基址寄存器 / 变址寄存器] > 寄存器
- 寄存器相对寻址: [基址寄存器 / 变址寄存器 + 偏移量值] > 寄存器
- 基址变址寻址: [基址寄存器 + 变址寄存器] > 寄存器
- 相对基址变址寻址: [基址寄存器 + 变址寄存器 + 偏移量值] > 寄存器
立即数寻址方式和寄存器相对寻址方式的使用频度最高。
其他:自增,自减,缩放(变址乘以系数)
# 2.3 指令系统设计与优化
对指令系统的基本要求:完整性、规整性(对称,均匀同等)、正交性(字段独立)、高效率、兼容性
指令格式的设计:确定指令字的编码方式,包括操作码字段和地址码字段的编码和表示方式
指令格式的优化:如何用最短的位数来表示指令的操作信息和地址信息
- 哈夫曼编码:构建哈夫曼树,左分支 1,右分支 0,获得的编码是变长度的。
用二进制编码表示 n 个码点时,理论上的最短平均编码长度:其中 表示指令频度;有哈夫曼编码实际编码平均长度 ,则信息冗余量为:
- 扩展操作码:采用有限几种固定长度的码长,仍然采用高概率的用短码、低概率用长码的哈夫曼压缩思想,使操作码平均长度缩短
2-4 的扩展操作码:以七种指令为例,用两位的 00、01、10 分别用于表示使用频度高的 I1、I2、I3,然后用 11 作为高位扩展出 4 个 4 位的二进制编码,用于表示剩下的 4 条指令 - 等长扩展码:
选择两种中的哪一种取决于频度分布,尽量使频度大的指令扩展码更短。 - 定长操作码:RISC 结构等许多计算机,硬件实现方便
指令系统的 3 种编码格式:可变长度编码格式、固定长度编码格式、混合型编码格式
- 可变长度编码格式:当指令系统的寻址方式和操作种类很多时效果最好,但可能导致各条指令的字长和执行时间相差很大;
- 固定长度编码格式:寻址方式和操作类型非常少时很好,降低译码的复杂度;
- 混合型编码格式:提供若干种固定的指令字长,折中方案
字为 64 位的机器,大端:00 -> 08,高位存在更低地址并从 00 开始;小端:08 -> 00,高位存在更高地址并从 08 开始。
# 2.4 指令系统设计与优化
沿 CISC 方向:指令数量多、功能多样
面向目标程序优化:对于使用频度高的指令,用硬件加快其执行;对于使用频度高的指令串,用一条新的指令来替代。
面向高级语言优化:对于高级语言增加专门的指令,例如乘加指令
面向操作系统优化:提供特权指令
沿 RISC 方向:指令条数少、指令功能简单
# 2.5 操作数类型和大小
操作数表示方法一:操作数类型由指令中的操作码指定(最常见的一种方法)
操作数表示方法二:在数据内(不是指令之中)可以附上由硬件解释的标记,由这些标记符通过硬件指定操作数类型,从而选择适当的运算
一台 32 位的机器应该支持 8、16、32 位整型操作数以及 32 位和 64 位的 IEEE754 标准浮点操作数。
# 2.6 典型指令系统
代码密度:编译具有同样功能的一段代码,指令与数据占用的空间越大,则代码密度低,也就是效率低;反之,代码密度高,执行效率高。
不同的指令序列对处理器的电气特性影响也不尽相同,主要表现为处理器功耗、电压以及温度等影响
零地址空间:计算机体系结构中不同的地址空间组织方式
三个零地址空间:通用寄存器、主存储器、输入输出设备独立编址
两个零地址空间:主存储器与输入输出设备统一编址
一个零地址空间:最低端是通用寄存器,最高端是输入输出设备,中间为主存储器
程序定位:
直接定位:在程序装入主存之前就已经确定
静态定位:在程序装入主存的过程中随即进行地址变换,确定在主存的物理地址
动态定位:在程序执行过程中,当访问到相应的指令或数据时才进行地址变换,确定在主存的物理地址