课程
CH02
第二章:指令系统的设计
了解指令系统结构三种类型:堆栈结构、累加器结构、通用寄存器结构
哈夫曼编码基本思想
- 缩短编码长度;
- 理解并掌握指令操作码的优化(计算案例)
掌握并能灵活应用常用的MIPS指令
- MIPS指令特点(浮点寄存器与整数寄存器)、数据寻址方式
- MIPS三种指令格式:I类指令、R类指令、J类指令
- MIPS指令操作分为四大类:Load、分支与跳转、…、…
指令系统结构的分类
区别不同指令系统结构的主要因素:
CPU中用来存储操作数的存储单元的类型
CPU中用来存储操作数的存储单元(指令使用的数据)
- 堆栈
- 累加器
- 通用寄存器组
根据操作数的来源不同,又可进一步分为:
- 寄存器-存储器结构(RM结构)(操作数可以来自存储器 )
- 寄存器-寄存器结构(RR结构)(所有操作数都是来自通用寄存器组)
也称为load-store结构,这个名称强调:只有load指令和store指令能够访问存储器。
表达式Z=X+Y在4种类型指令系统结构上的代码

通用寄存器型结构
现代指令系统结构的主流
在灵活性和提高性能方面有明显的优势
- 寄存器的访问 速度比存储器快。
- 对编译器而言,能更加容易、有效地分配和使用 寄存器。
- 寄存器可以用来存放变量。
(1)减少对存储器的访问,加快程序的执行速度;(因为寄存器比存储器快)(例如for循环中的自变量)
(2)用更少的地址位(相对于存储器地址来说)来对寄存器进行寻址,从而有效地减少程序的目标代码的大小。
在 RISC 中,存储指令一般通过寄存器间接寻址的方式访问存储器
哈夫曼编码
操作码优化的程度可以用信息熵来衡量
H即为用二进制编码表示n个码点时, 理论上的最短平均编码长度
哈夫曼编码的基本思想: 缩短编码长度, 利用字符的出现频率, 通过变长编码给高频字符分配短码, 低频字符分配长码, 实现整体编码长度最短。
例2.1 假设某模型机有7条指令,这些指令的使用频度如表所示。
(1) 计算这7条指令的操作码编码的最短平均码长;
(2) 画出哈夫曼树,写出这7条指令的哈夫曼编码,并计算该编码的平均码长和信息冗余量。

解 (1)这7条指令的操作码编码的最短平均码长
哈夫曼编码的平均码长:
哈夫曼编码优缺点:可以减少操作码的平均位数,但所获得的编码是变长度的,不规整,不利于硬件处理
扩展操作码: 位于定长二进制编码和哈夫曼编码之间的一种编码方案。
用两位的00、01、10分别用于表示使用频度高的I1、I2、I3,然后用11作为高位扩展出4个4位的二进制编码,用于表示剩下的4条指令。
平均码长
信息冗余量:
哈夫曼编码:
3位定长编码:
拓展编码:
MIPS指令
指令特点
特点: ALU指令的源和目标操作数都存放在寄存器中,只能通过Load和Store指令访问存储器,因此被称为Load-Store指令集结构;易于流水设计;寻址方式简单;操作简单
MIPS64 寄存器特点:
- 32个64位通用寄存器(GPRs)
R0,R1,…,R31, 也称为整数寄存器, R0的值永远是0
- 32个64位浮点数寄存器(FPRs)
F0,F1,…,F31, 用来存放32个单精度浮点数(32位),也可以用来存放32个双精度浮点数(64位)。存储单精度浮点数(32位)时,只用到FPR的一半,其另一半没用。
数据寻址方式
MIPS数据寻址方式的特点:
- 立即数寻址与偏移量寻址, 立即数字段和偏移量字段都是16位的。
- 寄存器间接寻址是通过把0作为偏移量来实现的;
- 16位绝对寻址是通过把R0(其值永远为0)作为基址寄存器来完成的;
注意:
- MIPS的存储器是按字节寻址的,地址为64位;
- GPRS和FPRS之间的数据传送都是通过load和store指令来完成的。
- 所有存储器访问都必须是边界对齐的。
- 寻址方式编码到操作码中, 操作码占6位
MIPS数据寻址方式支持4种:
- 寄存器寻址:如ADD R1, R2;
- 立即数寻址:ADD R1, R2, #42,#42表示立即数。
- 偏移寻址: ADD R1, R2, 42(R3)
- 寄存器间接寻址: ADD R1, R2, 0(R3),0偏移量可以省略;
三种指令格式
3种格式中,同名字段的位置固定不变。所有指令32位,操作码6位。固定长度
- I 类指令(立即数类型): 用于加载(load)、存储(store)、分支、寄存器跳转(修改pc)、链接跳转(函数调用)
格式:[op(操作码), rs, rt, immediate(立即数)]。
rs: 源操作数寄存器编号 rt: 目标寄存器编号
load指令
访存有效地址:Regs[rs]+immediate
从存储器取来的数据放入寄存器rt
store指令
访存有效地址:Regs[rs]+immediate
要存入存储器的数据放在寄存器rt中
- R 类指令(寄存器类型):
用于算术运算等操作,格式:
[op, rs, rt, rd, shamt, funct]。
包括ALU指令,专用寄存器读/写指令,move指令等
所有的操作数来自寄存器
rs、rt分别表示源寄存器1和源寄存器2,rd表示目标寄存器,shamt字段用于移位操作,funct字段指定具体的操作类型。
ALU指令
Regs[rd]← Regs[rs] funct Regs[rt]
funct为具体的运算操作编码
- J 类指令(无条件转移): 包括跳转指令,跳转并链接指令,自陷指令,异常返回指令。在这类指令中,指令字的低26位是偏移量,左移两位,它与PC值相加形成跳转的地址。
格式:[op, address]。
例如:j label。
MIPS指令操作分为四大类
- Load/Store 指令:加载和存储数据,例如
lw、sw。 - 分支与跳转指令:条件或无条件跳转,例如
beq、j。 - 算术与逻辑指令 (ALU 操作) :如
add、sub、and、or。 - 浮点操作指令 :
符号的意义
- x←ny:从y传送n位到x
- x,y←z:把z传送到x和y
下标:表示字段中具体的位;
- 对于指令和数据,按从最高位到最低位(即从左到右)的顺序依次进行编号,最高位为第0位,次高位为第1位,依此类推。
- 下标可以是一个数字,也可以是一个范围。
- 例如:Regs[R4]0:寄存器R4中内容的符号位
Regs[R4]56-63:共63-56+1=8位,寄存器R4内容的最低一个字节
Mem:表示主存
- 按字节寻址,可以传输任意个字节。
上标:用于表示对字段进行复制的次数。
- 例如:032:一个32位长的全0字段













