来源:checkoff/02、checkoff/03 页(https://cgi.cse.unsw.edu.au/~cs1521/26T3/checkoff/02/questions 、/03/questions,Synced 2026-09-20 / 09-26)
check-off 流程:tutor 在 lab 里走到你旁边,给你一段程序,陪你逐行过一遍,然后问几个问题; 过了会给你一个 access code,在 check-off 页面输入。其余 lab 题照常做。 你现在状态(student.md):Week 01 = True 5/5,Week 02 = False,Week 03 = False → 今天 16:00 lab 两个都要做。 程序是 tutor 当场给的,没法提前背答案——要练的是「看一行 MIPS 能说出它干嘛」。
1. 看到一行就要能说出来(Week 02 核心)
| 写法 | 意思 | 用 C 说 |
|---|---|---|
li $t0, 5 | 把常数 5 放进 $t0 | t0 = 5 |
move $t1, $t0 | 复制寄存器 | t1 = t0 |
add $t2, $t0, $t1 | 加 | t2 = t0 + t1 |
addi $t0, $t0, 1 | 加常数 | t0++ |
sub / mul | 减 / 乘 | - / * |
div $t2, $t0, $t1 / rem | 整除 / 取余 | / / % |
la $t0, label | 把 label 的地址放进来 | t0 = &label |
lw $t1, 0($t0) | 从地址 $t0 读 4 字节 | t1 = *t0 |
sw $t1, 0($t0) | 把 t0 | *t0 = t1 |
b label / j label | 无条件跳 | goto |
beq a, b, L / bne | 相等 / 不等就跳 | if (a == b) goto L |
blt ble bgt bge | < ≤ > ≥ 就跳 | |
beqz $t0, L | 为 0 就跳 | if (t0 == 0) |
jal f / jr $ra | 调函数 / 返回 | f() / return |
syscall(先把编号放 a0)
| $v0 | 作用 | 参数 / 结果 |
|---|---|---|
| 1 | print int | $a0 = 要打的数 |
| 4 | print string | $a0 = 字符串地址(用 la) |
| 5 | read int | 读到的数在 $v0 |
| 11 | print char | $a0 = 字符,如 '\n' |
| 10 | exit | — |
寄存器:$t0–$t9 临时;$s0–$s7 函数调用后还要保住的;$a0–$a3 传参;$v0 返回值/syscall 号;
$ra 返回地址;$sp 栈顶;$zero 永远是 0。
2. if / while 怎么变成 MIPS(tutor 最爱问)
口诀:条件取反,跳过去。
可能被问:「为什么是 bge 不是 blt?」→ 分支是"满足就跳走",跳走的地方是循环外面,所以要写循环结束的条件(i < 10 的反面 i >= 10)。
「if 后面那个 b endif 删了会怎样?」→ A 做完会掉进 B,两个都执行。
3. 数组 / 内存(Week 03 核心)
第 i 个元素的地址 = 数组首地址 + i × 4(int 占 4 字节)
必背问答:
- 为什么乘 4? int 4 字节,地址按字节算。char 数组就乘 1,用
lb/sb。 la和lw区别?la拿地址(门牌号),lw去那个地址把东西拿出来(屋里的东西)。- 忘了乘 4 会怎样? 读到错位的地址;
lw地址不是 4 的倍数会直接报 unaligned 错误。 numbers[i-1]? 地址再减 4,或写lw $t3, -4($t2)(括号前的数字是字节偏移)。- 2D 数组
a[r][c](每行 N 列):地址 = 首地址 + (r × N + c) × 4。 - struct:每个字段在首地址上加固定偏移,
lw $t0, 4($t1)= 取偏移 4 的那个字段。
4. 函数(Week 3 Lecture 2)
- 调用:参数放
$a0..$a3,jal f;返回值在$v0。 jal会把"回来的地址"写进$ra。函数里如果还要再jal别的,必须先把$ra存到栈上,不然 ra` 回不去(死循环或乱跳)。- 典型开头/结尾:
- 用了
$s寄存器也要这样先存后恢复;$t寄存器调用后不保证还在。
5. 被问到时的回答套路
- 先说这个寄存器代表 C 里哪个变量("$t0 是 i,$t1 是数组首地址")。
- 再说这一段对应 C 哪一行("这 4 行就是
x = numbers[i]")。 - 让你预测输出:拿第一个、第二个值手算一遍循环,别跳着猜。
- 真不会:说"我觉得这里是在算 &numbers[i],因为它乘了 4 再加首地址"——讲出推理比答对还重要。
6. 顺便复习你自己交过的 lab02(tutor 可能拿它问)
grade(if/else 链)、count(while 计数)、seveneleven(循环 + 取余判断)、sequence(循环 + 步长)。
开 lab 前把你自己的 .s 打开,每题能口述"哪个寄存器是哪个变量、哪行是循环条件"就够了。
lab03(printbigger / swap_numbers / unordered)截止 2026-10-06 12:00,还没开始。