chap2 指令系统的设计
[TOC]
2.1 指令系统结构的分类
区别不同指令系统的主要因素:CPU用来存储操作数的存储单元类型
-
堆栈:
隐式给出操作数
-
累加器
专门存放算术或逻辑运算的一个操作数和运算结果的寄存器。是唯一的暂存器,开销巨大
-
通用寄存器组
根据结构划分两种形式:
-
寄存器-存储器结构:(一边的操作数总是来自于存储器)
-
寄存器-寄存器结构:(RR结构)
- 现代主流,灵活高性能
Load-Store
结构,只有Load和Store能够访问存储器(优点:各种指令的时钟周期相近;缺点:目标代码不够紧凑)
根据ALU指令的操作数
-
3操作数:2src1dst
-
2操作数:1src1dst
-
对于不同结构,操作数的位置、个数以及操作数的给出方式不同
- 显示给出:用指令字中的操作数字段给出
- 隐式给出:用事先约定好的单元
2.2 寻址方式
寻址
-
任意存储
-
不能跨边界:信息在主存中存放的起始地址必须是该信息宽度(字节数)的整数倍 如
双字信息的起始地址为:×…×000
存在空间浪费,但是保证访问速度
存储效率:数据本身所需的存储量和整个数据所占的存储量之比
寻址方式:指令系统中如何形成所要访问的数据的地址
将寻址方式编码于操作码中
在指令字中设置专门的寻址字段
灵活,操作码短。但是操作码和寻址方式字段合起来所需要的总位数可能会比隐含方法的总位数多
-
寻址方式 指令实例 含义 立即值寻址 ADD R3 , #6 Regs[R3]←Regs[R3]+6 直接寻址或绝对寻址 ADD R4 , (1010) Regs[R4]←Regs[R4]+Mem[1010] 寄存器寻址 ADD R1 , R2 Regs[R1]←Regs[R1]+Regs[R2] 寄存器间接寻址 ADD R4 , (R2) Regs[R4]←Regs[R4]+Mem[Regs[R2]] 偏移寻址 (寄存器相对寻址) ADD R3 , 120(R2) Regs[R3]←Regs[R3]+Mem[120+Regs[R2]] 索引寻址 (基址变址寻址) ADD R4 , (R2 + R3) Regs[R4]←Regs[R4]+Mem[Regs[R2]+Regs[R3]] 相对基址变址寻址: ADD R4 , 120(R2 + R3) Regs[R4]←Regs[R4]+Mem[Regs[R2]+Regs[R3]+120] 存储器间接寻址 ADD R2 , @(R4) Regs[R2]←Regs[R2]+Mem[Mem[Regs[R4]]] 自增寻址 ADD R1 , (R2)+ Regs[R1]←Regs[R1]+Mem[Regs[R2]] Regs[R2]←Regs[R2]+d 自减寻址 ADD R1, -(R2) Regs[R2]←Regs[R2]-d Regs[R1]←Regs[R1]+Mem[Regs[R2]] 缩放寻址 ADD R1 , 80(R2)[R3] Regs[R1]←Regs[R1]+Mem[80+Regs[R2]+Regs[R3]*d]
编址:
定位
2.3 指令系统的设计与优化
指令系统设计
基本原则:
完整性、规整性、正交性、高效率、兼容性
分支条件的方法及其优缺点
名 称 | 检测分支条件的方法 | 优 点 | 缺 点 |
---|---|---|---|
条件码 (CC) | 检测由ALU操作设置的一些特殊的 位(即CC) | 可以自由 设置 分支条件 | 条件码是增设的状态。而且它 限制了指令的执行顺序,因为 要保证条件码能顺利地传送给 分支指令。 |
条件寄存器 | 比较指令把比较结果放入任何一个 寄存器,检测时就检测该寄存器。 | 简单 | 占用了一个寄存器 |
比较与分支 | 比较操作是分支指令的一部分,通 常这种比较是受到一定限制的。 | 用 一 条 指 令 (而不是两条) 就能实现分支 | 当采用流水方式时,该指令的 操作可能太多,在一拍内做不 完。 |
指令操作码码长的计算
用二进制编码表示n个码点时,理论上的最短平均编码长度
$$
H=-\Sigma_{i=1}^{n}p_ilog_2p_i
$$
信息冗余量,$\frac {L-H}{L}$
指令操作码(长)的优化
-
哈夫曼编码:构建哈夫曼树,$L=\Sigma_{i=1}^np_il_i$
-
扩展操作码:高概率的用短码、低概率用长码的哈夫曼压缩思想
- 采用2-4的扩展操作码:用两位的00、01、10分别用于表示使用频度高的I1、I2、I3,然后用11作为高位扩展出4个4位的二进制编码,用于表示剩下的4条指令
-
等长扩展码(便于分级译码)
-
定长操作码:所有指令的操作码都是统一的长度
指令字格式的优化
在指令系统的设计中,要在指令字长与寄存器个数以及寻址方式的个数之间进行折中
正常的risc都把寻址方式编进了操作码中,所以不需要考虑这个问题。但也可以让操作码尽可能短,在每一个地址码
之前加上用于确定寻址方式的地址描述符
2.4 指令系统的发展和改进
CISC方向优化:
-
面向目标程序(将程序中常出现的片段提取成为一条指令)
-
面向高级语言(提取将高级语言的语法或者直接将高级语言作为机器语言)
-
面向操作系统:支持操作系统的功能
RISC方向:
强调优化编译器等
2.5 操作数类型和大小
2.6 典型指令系统(RISC-V)