上机总结
第二次上机主要考的是 MIPS 汇编,这次 P2 上机也不算很难,但是莫名感觉体验比较一般,或者说还是挺惊心动魄的(?)。
第一题是素数判断,第二题是约瑟夫环问题(暴力即可,重点在于数组的使用),第三题是翻译快排(递归)。
第一题没啥好说的,直接莽就好了。第二题看数据范围怕 TLE,而且约瑟夫环又有线性复杂度的数学解法,但是我又忘了怎么推导的,导致一开始非常心虚。然后在没有写出 C 代码的情况下开始直接写汇编,脑子有点混沌,结果越写心情越差,于是只能先 skip 了。然后就是噩梦的第三题。其实第三题并不难,好多同学表示直接翻译就过了,但是我和另外一些同学直接翻译就是莫名 TLE,所以更加心虚了。同时在评测的时候又做错了附加题,这个时候状态非常不好,心态极差……
定了定心后回去写第二题,搞了个暴力 A 了(其实也确实觉得不会出成算法题)。这个时候心里想着“算了,没有优秀也没关系”这种想法来安慰自己,开始瞎搞第三题,加了各种优化都没过。看着时间还剩下半个小时就想尝试一下改变快排基准值,结果莫名 A 了。就算是出了考场我也没想通问题到底在哪儿……
如果说这次上机能提供什么经验的话,我想应该有三点:
- 不要被身边的人干扰了心态,看到身边的人一个个走了真的会对心态造成干扰。
- 附加题不要莽,最好在做完前面的题后静心看看,不然等前面的题做完了后看到附加题被自己瞎猜猜错了,就会很揪心。
- 平时要好好学算法(溜)
课下总结
常用宏命令
二维数组取地址
.macro INDEX(%ans, %i, %j, %rank)
multu %i, %rank
mflo %ans
add %ans, %j
sll %ans, %ans, 2
.end_macro
读入和输出整数
.macro RI(%n)
li $v0, 5
syscall
move %n, $v0
.end_macro
.macro PI(%n)
li $v0, 1
move $a0, %n
syscall
.end_macro
保护和读取寄存器
.macro LOAD_LOCAL(%var)
addi $sp, $sp, 4
lw %var 0($sp)
.end_macro
.macro SAVE_LOCAL(%var)
sw %var 0($sp)
subi $sp, $sp, 4
.end_macro
输出空白和换行
.macro PSPACE
la $a0, str_space
li $v0, 4
syscall
.end_macro
.macro PENTER
la $a0, str_enter
li $v0, 4
syscall
.end_macro
常见错误
- 数据类型的大小:
int: 1word, 4byte
,用lw/sw
,记得sll $t0, $t0, 2
;char: 1byte
,用lb/sb
- 递归:存储数据和恢复数据的顺序恰好相反