MIPS32指令集与编程
从指令编码到流水线机制再到函数调用约定,建立可推导的MIPS汇编思维框架
按 空格/→ 演示下一步
全部页面点击任意一页,跳回舞台从这页播放
MIPS32指令集与编程
从指令编码到流水线机制再到函数调用约定,建立可推导的MIPS汇编思维框架
MIPS32指令集与编程-1
学汇编的人绕不开MIPS32——教科书讲它、面试问它、考研考它。但你有没有想过:为什么偏偏是它?答案藏在一个缩写里:RISC——精简指令集计算机。
调料种类少但每种功能标准明确,组合起来能做出任何菜;MIPS指令简单但能组合出任意程序
MIPS32指令集与编程-2
上一页我们认识了32个寄存器——它们像32个抽屉,每条指令都得说清「对哪个抽屉做什么」。但指令本身是怎么用32个比特把这事讲明白的?
op=表头标题决定表种类;rs/rt/rd/imm各占若干格;总行宽固定32格
MIPS32指令集与编程-3
MIPS32指令集与编程-3:定义、要点与典型应用
MIPS32指令集与编程-4
前页我们用 I 型格式描述分支:操作码 + 两寄存器 + 16 位立即数。但分支目标地址怎么算?早期 MIPS 程序里那条「总是会执行」的指令是什么?这一页讲清楚。
助手必须切完手头洋葱才能切下一道——分支跳走前,紧跟的指令总是先跑完
MIPS32指令集与编程-5
前面我们用 lw/sw 把数据搬进搬出寄存器,但程序不能只会搬数据——它得会判断、会循环、会调子程序,这全靠「控制转移」指令:让 PC 不再机械地顺序加 4。
调度员变道前必先安排好下一节车厢走哪——这条「无论变不变道都得先驶过去」的车厢就是延迟槽
MIPS32指令集与编程-6
MIPS32指令集与编程-6:定义、要点与典型应用
MIPS32指令集与编程-7
前面写过 `beq $t0, $zero, loop`——你以为 CPU 会立刻跳到 loop?错了。分支指令后面那条,它照样会执行一次。这一格就叫「分支延迟槽」。
跳转决定已发出,但下一节车厢已挂上,必须跑完这一段才真正分岔
本节要点
- ✓三种指令格式的字段划分决定寻址模式与操作数来源
- ✓Load/Store是唯一访存通路,R型指令不触碰内存
- ✓$sp/$ra/$a0-$a3等寄存器约定是调用契约
- ✓延迟槽是流水线遗留,编译器需用nop或重排填充
- ✓伪指令是汇编器语法糖,需还原为真实机器码
课后思考
先遮住参考答案写下自己的思路,再对照 a1/a2/a3 看方向对不对。
参考答案这是Load/Store架构的体现:ALU只对寄存器操作,只有lw/sw能访存。好处是长度规整、流水线更容易并行。
参考答案ori把立即数做无符号扩展,装载高位全1的负数时,ori会先清零高位再相加,结果错误。常见做法是改用addi。
参考答案现代CPU用分支预测取代延迟槽。移植老代码时,原本假设'延迟槽必执行'的优化会失效,关键指令可能被跳过。