视频加载失败

课程

3514 字
约 11 分钟

CH02

计算机体系结构notes/csdn-review·更新于 2026-09-15

第二章:指令系统的设计

了解指令系统结构三种类型:堆栈结构、累加器结构、通用寄存器结构

哈夫曼编码基本思想

  • 缩短编码长度;
  • 理解并掌握指令操作码的优化(计算案例)

掌握并能灵活应用常用的MIPS指令

  • MIPS指令特点(浮点寄存器与整数寄存器)、数据寻址方式
  • MIPS三种指令格式:I类指令、R类指令、J类指令
  • MIPS指令操作分为四大类:Load、分支与跳转、…、…

指令系统结构的分类

区别不同指令系统结构的主要因素:

CPU中用来存储操作数的存储单元的类型

CPU中用来存储操作数的存储单元(指令使用的数据)

  • 堆栈
  • 累加器
  • 通用寄存器组

根据操作数的来源不同,又可进一步分为:

  • 寄存器-存储器结构(RM结构)(操作数可以来自存储器 )
  • 寄存器-寄存器结构(RR结构)(所有操作数都是来自通用寄存器组)

也称为load-store结构,这个名称强调:只有load指令和store指令能够访问存储器。

表达式Z=X+Y在4种类型指令系统结构上的代码

img

通用寄存器型结构

现代指令系统结构的主流

在灵活性和提高性能方面有明显的优势

  • 寄存器的访问 速度比存储器快。
  • 对编译器而言,能更加容易、有效地分配和使用 寄存器。
  • 寄存器可以用来存放变量。

(1)减少对存储器的访问,加快程序的执行速度;(因为寄存器比存储器快)(例如for循环中的自变量)

(2)用更少的地址位(相对于存储器地址来说)来对寄存器进行寻址,从而有效地减少程序的目标代码的大小。

在 RISC 中,存储指令一般通过寄存器间接寻址的方式访问存储器

哈夫曼编码

操作码优化的程度可以用信息熵来衡量 H=i=1npilog2piH=-\sum^n_{i=1} p_i log_2 p_i

H即为用二进制编码表示n个码点时, 理论上的最短平均编码长度

哈夫曼编码的基本思想: 缩短编码长度, 利用字符的出现频率, 通过变长编码给高频字符分配短码, 低频字符分配长码, 实现整体编码长度最短。

例2.1 假设某模型机有7条指令,这些指令的使用频度如表所示。

(1) 计算这7条指令的操作码编码的最短平均码长;

(2) 画出哈夫曼树,写出这7条指令的哈夫曼编码,并计算该编码的平均码长和信息冗余量。

img

解 (1)这7条指令的操作码编码的最短平均码长

H=i=17pilog2pi=2.17H=-\sum^7_{i=1} p_i log_2 p_i=2.17

哈夫曼编码的平均码长:H=i=17pili=0.4×1+0.3×2+0.15×3+0.05×5+0.04×5+0.03×5+0.03×5=2.20H=\sum^7_{i=1} p_i l_i=0.4 \times 1 + 0.3 \times 2 + 0.15 \times 3 + 0.05 \times 5 + 0.04 \times 5 + 0.03 \times 5 + 0.03 \times 5 = 2.20

哈夫曼编码优缺点:可以减少操作码的平均位数,但所获得的编码是变长度的,不规整,不利于硬件处理

扩展操作码: 位于定长二进制编码和哈夫曼编码之间的一种编码方案。

用两位的00、01、10分别用于表示使用频度高的I1、I2、I3,然后用11作为高位扩展出4个4位的二进制编码,用于表示剩下的4条指令。

平均码长 H=i=17pili=2.3H=\sum^7_{i=1} p_i l_i=2.3

信息冗余量: 操作码的平均码长H操作码的平均码长\frac{操作码的平均码长-H}{操作码的平均码长}

哈夫曼编码: (2.22.17)/2.21.36%(2.2-2.17)/2.2 \approx 1.36\%

3位定长编码: (32.17)/328%(3-2.17)/3 \approx 28\%

拓展编码: (2.32.17)/2.35.56%(2.3-2.17)/2.3 \approx 5.56\%

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 指令:加载和存储数据,例如 lwsw
  • 分支与跳转指令:条件或无条件跳转,例如 beqj
  • 算术与逻辑指令 (ALU 操作) :如 addsubandor
  • 浮点操作指令

符号的意义

  • 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字段
Profile Image of the Author
Sonder
好想要技术
这是公告标题
这只是一个公告
分类
标签
站点信息
构建平台
GitHub Actions
博客版本
Firefly v6.16.7
文章许可
CC BY-NC-SA 4.0
文章目录