MIPS32架构与指令集初步

官方信息技术老师·11 页·深入(追求细节与边界)·0 次浏览·3 天前
指令格式寄存器流水线RISC

MIPS32架构与指令集初步

拆透MIPS32:指令如何编码、寄存器如何分工、流水线在何处翻车

按 空格/→ 演示下一步

1 / 11 页

全部页面点击任意一页,跳回舞台从这页播放

指令格式寄存器流水线RISC

MIPS32架构与指令集初步

拆透MIPS32:指令如何编码、寄存器如何分工、流水线在何处翻车

1第 1 页 · MIPS32架构与指令集初步

MIPS32架构与指令集初步-1

上一节我们把MIPS放进CPU指令集版图。本节定义:MIPS32是32位RISC指令集架构,由MIPS公司1985年商业化。Load/Store与定长指令是它的两道标签。

RISC设计哲学
简化指令、固定格式、大量寄存器,把复杂度从硬件挪给编译器
Load/Store架构
算术逻辑指令只读写寄存器;内存只能由lw/sw等专用指令访问
32个通用寄存器
$0~$31共32个GPR,$0硬连线为0;约定$sp/$ra/$a0~$a3有特定用途
定长32位指令
所有指令32位宽;分R/I/J三型,字段位置固定,流水线友好
典型应用与现状
家用路由器、PS1/PS2/N64、打印机SoC;2010年后被RISC-V逐步替代
标准集装箱码头对应 →MIPS32定长指令

所有指令32位等长=所有集装箱同尺寸,吊车只需一种抓取动作,取指/译码可流水线化

2第 2 页 · MIPS32架构与指令集初步-1

MIPS32架构与指令集初步-2

CPU不懂自然语言,只能认32位长的固定二进制。MIPS32把这32位切成三种句式来表达不同意图——像中文有陈述、祈使、感叹三种句式一样,各司其职。

R型指令
三寄存器操作,funct字段区分具体运算,用于算术逻辑
I型指令
含16位立即数,用于访存、分支、立即数运算
J型指令
26位目标地址,无条件跳转 j、jal 用此格式
定长32位
所有指令统一长度,取指译码硬件简单,流水线友好
中文三种句式对应 →MIPS三型指令

陈述句=I型描述事实,祈使句=J型下跳转命令,复合句=R型多寄存器组合

R: 6+5+5+5+5+6=32, I: 6+5+5+16=32, J: 6+26=32\text{R: }6+5+5+5+5+6=32,\ \text{I: }6+5+5+16=32,\ \text{J: }6+26=32
3第 3 页 · MIPS32架构与指令集初步-2

MIPS32架构与指令集初步-3

上页讲 MIPS32 是 RISC:所有指令都是 32 位定长。但同样 32 位,加法要装三个寄存器号加功能码,跳转要装下整个目标地址——所以字段布局分 R/I/J 三种。

R型指令格式
三寄存器号 + funct 码;用于 add/sub/sll 等寄存器-寄存器操作
I型指令格式
两寄存器 + 16 位立即数;用于 addi/lw/sw/beq 等
J型指令格式
opcode + 26 位目标地址;专用于 j/jal 长跳转
寄存器使用约定
$0 恒为零;$ra 返回地址;$sp 栈指针;$a0-$a3 传参;$v0-$v1 返回值
典型应用领域
家用路由器(OpenWrt)、嵌入式控制、PS2/PSP/N64 与高校体系结构教学
不同业务填不同表对应 →三种指令格式

不同操作对应不同字段布局,关键字段位置固定——就像不同格子填特定信息

4第 4 页 · MIPS32架构与指令集初步-3

MIPS32架构与指令集初步-4

上一页讲到 beq/bne 会改 PC,但流水线里 IF 已经把下一条指令取上来了。这条紧跟分支的指令,到底执行不执行?

延迟槽定义
分支指令紧随其后的那条指令,无论分支走不走,都会被执行
存在原因
流水线 IF 已取到下一条指令,丢弃它会让流水线空转一拍
填充策略
编译器/程序员可填有用指令(指令调度),否则用 nop 补位
边界情况
跳转指令 jr/jal 同样有延迟槽;MIPS32 R6 起被废除,改用分支预测
餐厅点最后一道菜对应 →延迟槽指令

厨师已接到这道菜,不论后面改不改主意,菜都会做完端上来

5第 5 页 · MIPS32架构与指令集初步-4

MIPS32架构与指令集初步-5

上页我们把指令拆成字段看,但 CPU 执行时还得解决一个问题:操作数到底在哪里?靠「寻址模式」来回答。

寄存器寻址
操作数就在寄存器中,CPU 自带的高速抽屉
立即寻址
常数直接编在指令字里,不必再访存
基址寻址
基址寄存器+偏移,lw/sw 访问内存用此法
PC 相对寻址
以 PC 为基准的偏移,beq/bne 分支采用
伪直接寻址
目标地址高 4 位拼接,j/jal 长跳转使用
找东西的不同方式对应 →MIPS 寻址模式

口袋里摸(寄存器)、手上写地址(立即)、给路名+门牌号(基址)、「往前走N步」(PC相对)

6第 6 页 · MIPS32架构与指令集初步-5

MIPS32架构与指令集初步-6

上一页拆解了指令的二进制格式,但光知道字段怎么划分还不够——字段里的数字到底怎么变成实际地址?这页看 MIPS32 的五种寻址方式。

立即数寻址
操作数直接编码在指令的立即数字段里,如 addi 中的常数
寄存器寻址
操作数就在寄存器编号指定的寄存器中,如 R 型指令的 rs/rt
基址+偏移寻址
有效地址 = 基址寄存器 + 符号扩展后的 16 位偏移
PC相对寻址
分支目标 = (PC+4) + 偏移×4,仅 beq/bne 使用
伪直接寻址
跳转目标 = {PC+4高4位, 指令低26位, 00},j/jal 用此
找地址的五种办法对应 →MIPS32寻址方式

门牌号→立即数;工位号→寄存器;楼层+房号→基址+偏移;离当前位置远近→PC相对;区域+街道→伪直接

target=(PC+4)+sign_extend(offset)×4\text{target} = (PC + 4) + \text{sign\_extend}(\text{offset}) \times 4
7第 7 页 · MIPS32架构与指令集初步-6

MIPS32架构与指令集初步-7

前几页讲了 beq、bne 这些分支指令会改 PC、让 CPU 跳走。但 MIPS 有个反直觉细节:分支之后的下一条,无论跳不跳,都一定会被执行。这个必执行的指令位,就叫「延迟槽」。

延迟槽定义
分支指令的下一个指令位,无论分支跳与不跳,都会被执行一次
产生原因
流水线在分支结果出来前已预取了下条指令,丢弃会浪费一个时钟周期
编译器处理
优先调度一条有用指令填入;调度不到就填 nop(空操作)占位
跳转也适用
jr、jal 等无条件跳转指令同样带有延迟槽,规则一致
转向时已经迈出的那一步对应 →延迟槽中的指令

方向盘已经打了,但脚已落地,那一步必须走完才能真正转过去

8第 8 页 · MIPS32架构与指令集初步-7

MIPS32架构与指令集初步-8

上页讲了逻辑运算——位与位之间『逐位算计』。还有一类操作根本不看位与位的关系,而是把整组位整体往左或往右『挪位置』——这就是移位指令。

逻辑左移 sll
所有位整体左移,低位补0;移 n 位等价于乘 2ⁿ
逻辑右移 srl
所有位整体右移,高位补0;用于无符号数除以 2ⁿ
算术右移 sra
整体右移但高位补符号位,保持有符号数语义
移位量 shamt
指令中 5 位字段直接给出 0~31,无需读寄存器
十进制小数点移位对应 →二进制位整体移位

1234→123.4 是除以10;二进制 1100 左移两位变 110000 是乘 4

9第 9 页 · MIPS32架构与指令集初步-8

本节要点

  • MIPS是Load/Store架构:只有lw/sw访存,其他指令操作寄存器
  • $0恒零、$31存ra是硬件接线保证,不是软件约定
  • 指令格式由操作码决定,分R/I/J三型,字段不能跨型复用
  • 默认大端序;addi做符号扩展,andi/ori做零扩展
  • 早期MIPS分支有延迟槽,下一条必执行,是易错边界
延伸主题:流水线与数据/控制冒险CP0协处理器与中断异常指令编码字段逐位拆解
10第 10 页 · 本节要点

课后思考

先独立思考,再对照参考答案。三题分别对应回顾、应用、迁移。

1MIPS为何把指令长度统一为32位?这背后的硬件考量是什么?

参考答案固定长度让指令译码和取指极其规整,流水线可切成等长阶段,提频容易。代价是同样逻辑要更多指令,代码密度比x86低约30%。

2如果取消分支延迟槽,一段循环里的分支会损失多少性能?

参考答案延迟槽原本是用免费指令填充分支后的停顿周期。去掉后那个周期变成气泡,N次循环约多出N个周期开销。

3AI芯片做矩阵乘法时,MIPS的RISC思路还会是首选吗?为什么?

参考答案矩阵运算是规则乘加数据流,更适合SIMD或脉动阵列这类数据并行架构。MIPS通用寄存器吞吐矩阵元素,端口会成为瓶颈。

11第 11 页 · 课后思考