02 指令 | 计算机组成原理
1. 指令系统
1. 指令系统概述
- 指令系统:是计算机硬件的语言系统,它是软件和硬件的主要界面,从系统结构的角度看,指令系统表征了计算机的基本功能,决定了机器所要求的能力
- 指令系统设计原则
- 完备性:提供的质量足够解决任何可解的问题
- 有效性:简洁加速常用操作,没有歧义
- 规整性:对称、匀齐、一致
- 兼容性:对于之前和之后的版本都能使用
- 完善的指令系统的组成部分
- 数据传送指令:\(Load/Store\)指令
- 输入输出指令:\(In/Out\)指令
- 算术运算指令:\(Add\)等指令
- 逻辑运算指令:\(And\)等指令
- 系统控制指令:中断等指令
- 程序控制指令:\(Jump\)等指令
2. 两种指令系统计算机\(CISC\)和\(RISC\)
- \(CISC(Complex Instruction Set Computer)\):复杂指令集计算机
- 特点
- 指令系统复杂
- 指令周期长
- 各种指令都能访问存储器
- 用专用的寄存器
- 采用微程序控制
- 难以进行编译优化生成高效的目标代码
- 存在的问题
- 研制周期长
- 难以保证设计的准确性,难以调试和维护
- 机器的时钟周期长,降低了系统性能
- 效率低下
- 特点
- \(RISC(Reduced Instruction Set Computer)\):精简指令集计算机
- 特点
- 简化的指令系统
- 以寄存器-寄存器的方式工作
- 指令周期短
- 采用大量通用寄存器,以减少访存次数
- 采用组合逻辑电路控制,不用或少用微程序控制
- 采用优化的编译系统,力求有效地支持高级语言程序
- 常用的\(RISC\)指令集
- \(ARM\)
- \(MIPS\)
- \(RISC-V\)
- \(DECAlpha\)
- \(SPARC\)
- \(PowerArchitecture\)
- 特点
2. 指令格式
1. 指令格式的组成
- 组成:指令 = 操作码 + 地址码;一条指令包括1个操作码和多个操作码
- 指令按组成分类
- 零地址指令
[OP]
- 一地址指令
[OP][Address1]
- 二地址指令(最常用)
[OP][Address1, Address2]
- 三地址指令(\(RISC\) 风格)
[OP][Address1, Address2, Address3]
- 多地址指令
- 零地址指令
2. 操作码的设计
- 操作码长度
- 定长操作码:指令操作码部分采用 固定长度 的编码
- 特点:译码简单,但是会有信息冗余
- 扩展操作码:指令的操作码部分采用 可变长度 的编码,将操作码的位数分为几种固定长度的格式,操作码的位数随地址数的减少而增加
- 优点:
- 缩短指令长度
- 减少程序总位数
- 增加指令字所能表示的信息
- 重要原则:使用频度高的指令对应更短的操作码;使用频度低的指令对应较长的操作码
- 优点:
- 定长操作码:指令操作码部分采用 固定长度 的编码
- 操作码相关计算
- 例:某指令系统指令字长16位,每个地址码为6位。若二地址指令15条,一地址指令34条,则剩下零地址指令最多有多少条?
解: 操作码按短到长进行扩展编码
二地址指令: (0000 ~ 1110)
一地址指令: 11110 (00000 ~ 11111);11111 (00000 ~ 00001)
零地址指令: 11111 (00010 – 11111); (000000 – 111111)
故零地址指令最多有: \((2^5-2) ×2^6=15×2^7\) 种
- 例:某指令系统指令字长16位,每个地址码为6位。若二地址指令15条,一地址指令34条,则剩下零地址指令最多有多少条?
3. 寻址方式
1. 指令系统的寻址
- 指令 寻址和 操作数 寻址
2. 基本寻址方式分类
- 立即数寻址
- 方式:源操作数直接就在指令中
- 特点
- 指令执行时间短:直接从指令中取操作数
- 操作数大小受到地址字段的限制
- 广泛使用
- 存储器直接寻址
- 方式:操作数在 存储器 中,指令中的是操作数在存储器当中的 地址
- 特点
- 处理直接,简单
- 寻址空间受到指令的地址字段长度的限制
- 较少使用,只有少数的 \(8\) 位计算机和 \(16\) 位计算机使用
- 寄存器寻址
- 方式:操作数在 寄存器 中,指令中的是操作数存放的 寄存器编号
- 特点
- 只需要很短的地址字段:寄存器数量较少
- 无需访问内存储器,指令执行速度快
- 地址范围有限,可以为编程使用的寄存器不多
- 使用最多,是提高性能的常用手段
- 存储器间接寻址
- 方式:操作数和操作数的地址都在 存储器 中,指令中的是操作数地址在存储器当中的地址
- 特点
- 寻址空间大,灵活,易于编程
- 至少需要两次访存才能取到操作数,执行速度慢
- 寄存器间接寻址
- 方式:操作数在存储器中,操作数地址在 寄存器 中,指令中的是 寄存器编号
- 特点
- 寻址空间大,较为普遍
- 比存储器间接寻址少访问一次存储器
- 偏移寻址
- 相对寻址:
NextAddress = (PC) + A
:相对当前指令地址PC
,位移量为A
的单位 - 基址寻址:
NextAddress = (Base) + A
- 相对于基址
Base
处位移量为A
的单元 - 应用:程序 重定位
- 主要面向计算机系统
- 偏移位数较短
- 相对于基址
- 变址寻址:
NextAddress = (I) + A
- 相对于形式地址
A
位移量为(I)
的单元 - 应用:实现线性表元素的存取(如数组)
- 主要面向用户
- 偏移维数足以表示整个存储空间
- 相对于形式地址
- 相对寻址:
- 堆栈寻址
3. 寻址方式的确定
- 在操作码中给定寻址方式
- 专门的寻址方式位
4. 存储器编址单位
- 一般是字节编址(一个地址为一个字节)
4. 数据的表示
1. 数据的基本概念
- 数据变量的六要素:名称,类型,值,地址,作用域,生命周期
- 数据宽度
- 位
bit
:计算机处理存储传输信息的最小单位 - 字节
byte
:计算机中二进制信息的主要存放单位,现代计算机的主存是按字节编址,字节是最小的可寻址单位,1byte
= 8bit
s - 字
word
:表示被处理信息的单位,用来度量数据类型的宽度 - 字长
word length
:子长是指 \(CPU\) 数据通路的宽度,等于 \(CPU\) 内部总线的宽度或者运算器的位数或者通用寄存器的宽度等
字和字长的 区别
字是处理信息的单位,和字长的宽度可以一样也可以不一样,通常是字节
byte
的整数倍 - 位
2. 正数与负数
- 原码:用
0
表示正数,用1
表示负数val = +90
,二进制原码为0 1011010
val = -90
,二进制原码为1 1011010
- 反码:如果是负数,直接将二进制真值 逐位取反
- 补码:如果是负数,在反码的基础上 加一
- 移码:与补码的符号位相反:即 用
1
表示正数,用0
表示负数
3. 浮点数 \(IEEE 754\)
-
符号位
S
:1表示负数,0表示正数 -
尾数
f
:尾数为原码,其中对小数进行 规格化,使得最高位总为1,然后隐含这一位的表示;因此单精度表示精度为 \(1+23\)bits
,双精度表示精度为 \(1+52\)bits
(尾数精度=尾数的位数 + 1) -
阶码
e
- 偏置常数
bias
:对于每一个阶数都要加上一个偏置常数,便于浮点数加减运算以及比较操作的时候进行 对阶操作 - 单精度的偏置常数为 127,双精度的偏置常数为 1023
为什么不是单精度的偏置常数不是 \(2^7 = 128\)
原本利用移码的操作应该加上 \(2^{n-1}\) 的固定值,但是 \(IEEE 754\)为了处理一些特殊情况:无穷\(\infty\),
NaN
(Not a Number) 和 \(0\) 等,因此除去这些特殊的情况后设置的偏置常数为 \(2^{n-1}-1\) - 偏置常数
-
单精度表示
-
双精度表示
-
转换公式(以单精度为例)
- 将二进制浮点转换为十进制\[Num_{10} = (-1)^S \times (1 + f) \times 2^{e - 127} \]
- 将十进制小数转换为二进制浮点型
- 对整数和小数进行二进制转换
- 规格化:整数部分只留下1
- 阶码加上 127
- 将二进制浮点转换为十进制
-
浮点数的特殊值表示
-
单精度范围:\(-3.40\times 10^{38} \sim +3.40\times 10^{38}\)
-
双精度范围:\(-1.79\times 10^{308} \sim ~ +1.79\times 10^{308}\)
-
浮点数加法不符合结合律
4. 数值数据的十进制表示
- \(ASCII\) 码
- 把十进制数看作字符串,0~9分别对应 \(30Hex\sim 39Hex\),一位十进制数用八位二进制表示
- 正负数
- 方法一:直接加正号负号的\(ASCII\)码:
+
:2B Hex,-
:2D Hex - 方法二:符号位嵌入到最低位数字的ASCII码的高4位,省一个字节
- 正数:最低位数字的高四位不变
- 负数:最低位数字的高四位变为
0111
- 方法一:直接加正号负号的\(ASCII\)码:
- \(BCD\) 码
- 思想:0~9每个十进制数位至少用4位二进制位来表示
- 有权码和无权码
-
有权码:表示每个十进制数位的4个二进制数位(称基2码)都有一个确定的权,如8421码
-
无权码:表示每个十进制数位的4个基2码没有确定的权,如余3码和格雷码
十进制数字 8421 余三码 格雷码 0 0000 0011 0000 1 0001 0100 0001 2 0010 0101 0011 3 0011 0110 0010 4 0100 0111 0110 5 0101 1000 1110 6 0110 1001 1010 7 0111 1010 1000 8 1000 1011 1100 9 1001 1100 0100
-
5. 字符数据的机器表示
- 7位\(ASCII\)码
- 汉字以及国际字符编码:\(Unicode\)
6. 数据的度量和存储
-
数据的度量单位
度量单位 缩写 存储二进制换算关系 描述计算机通信带宽的换算关系 千字节 KB \(1KB=2^{10}bytes=1024B\) \(1KB=10^3bytes=1000B\) 兆字节 MB \(1MB=2^{20}bytes=1024KB\) \(1MB=10^6bytes=1000KB\) 千兆字节 GB \(1GB=2^{30}bytes=1024MB\) \(1GB=10^9bytes=1000MB\) 兆兆字节 TB \(1TB=2^{40}bytes=1024GB\) \(1TB=10^{12}bytes=1000GB\) -
数据的存储方式
- 大端方式:\(MSB\)最高有效位所在的地址是数的起始地址
- 小端方式:\(LSB\)最低有效位所在的地址是数的起始地址
-
数据对齐
- 按边界对齐(假定字的宽度为32位,存储器按字节编址)
- 字地址:4的倍数
- 半字地址:2的倍数
- 字节地址:任意等字节长度
- 不按边界对齐:存储更紧凑,但是会增加访存次数
- 按边界对齐(假定字的宽度为32位,存储器按字节编址)
7. 基本指令和指令类型
- 指令系统组成
- 数据传送指令:\(Move\)、\(Store\)、\(Load\)、\(Exchange\)等
- 算术运算指令:定点数,浮点数,十进制数字的运算
- 逻辑运算指令:\(And\)、\(Or\)、\(Not\)、\(Xor\)、\(Compare\)等
- 输入输出指令:\(IN\)、\(OUT\)等
- 系统控制指令:启动IO设备,存取特殊寄存器指令等
- 程序控制指令:转移指令,循环控制指令,子程序调用以及返回,程序中断以及返回指令
- 使用子程序的优势
- 降低程序设计的复杂度
- 提高程序的可重用性
- 节省存储空间
- 是模块化程序设计的基础,子程序库
5. 程序的机器级表示
1. MIPS 指令系统介绍
- 指令长度:都是32位宽,按字地址对齐
- 三种指令格式
-
R-Type
:用于寄存器,两个操作数都是寄存器的运算指令字段 OP
rs
rt
rd
shamt
funct
含义 操作码 第一个源操作数寄存器 第二个操作数寄存器 结果寄存器 移位指令的位移量 功能码(op操作的特定变式) 位数 6 5 5 5 5 6 -
I-Type
:一个寄存器,一个立即数字段 OP
rs
rt
immediate
含义 操作码 源操作数寄存器 结果寄存器 立即数或者偏移地址数 位数 6 5 5 16 -
J-Type
:无条件跳转指令字段 OP
Address
含义 操作码 偏移地址 位数 6 26 - 无条件转移地址的低26位;将PC高4位拼上26位直接地址,最后添2个0, 就是32位目标地址
J-Type
为什么要添加两个0(左移2位)J-Type
跳转到传递的目标。但是,由于指令集限制为32位,并且6个用于操作码,因此仅26个可以用于跳转目标。这意味着J-Type
可以通过的距离受到限制;MIPS指令集可以这样定义:遇到J-Type
时,将PC的高4位添加到J-Type
的26位目标上,但是要注意的是,该指令是程序能跳的地址总是"字对齐的"。这意味着这些地址始终是4的倍数,因此地址的最后2位始终是0。这使我们可以不对跳转目标中的最后2位进行编码
-
- 指令类型
- 算术逻辑运算指令
- 数据传输指令
- 条件分支指令
- 无条件跳转指令
- 条件转移指令通常根据
Condition Codes
(条件码 / 状态位 / 标志位)进行转移- 标志位:
SF
:负数标志;OF
:溢出标志;CF
:进位指令;ZF
:零标志 - 设置
CF
和OF
- 设置
CF
标志时,运算结果被视为无符号数 - 设置
OF
标志时,运算结果被视为有符号数 - 区别
- 进/借位
CF
表示无符号数的运算结果是否超出范围,即使超出范围,如果保存进位或借位,运算结果仍然是正确的 - 溢出标志
OF
表示有符号数的运算结果是否超出范围,若超出范围,则运算结果不正确
- 进/借位
- 设置
- 标志位: