[BUAA-CO-Lab] P2 MIPS 汇编程序设计

Posted by roife on Sun, Nov 8, 2020

上机总结

第二次上机主要考的是 MIPS 汇编,这次 P2 上机也不算很难,但是莫名感觉体验比较一般,或者说还是挺惊心动魄的(?)。

第一题是素数判断,第二题是约瑟夫环问题(暴力即可,重点在于数组的使用),第三题是翻译快排(递归)。

第一题没啥好说的,直接莽就好了。第二题看数据范围怕 TLE,而且约瑟夫环又有线性复杂度的数学解法,但是我又忘了怎么推导的,导致一开始非常心虚。然后在没有写出 C 代码的情况下开始直接写汇编,脑子有点混沌,结果越写心情越差,于是只能先 skip 了。然后就是噩梦的第三题。其实第三题并不难,好多同学表示直接翻译就过了,但是我和另外一些同学直接翻译就是莫名 TLE,所以更加心虚了。同时在评测的时候又做错了附加题,这个时候状态非常不好,心态极差……

定了定心后回去写第二题,搞了个暴力 A 了(其实也确实觉得不会出成算法题)。这个时候心里想着“算了,没有优秀也没关系”这种想法来安慰自己,开始瞎搞第三题,加了各种优化都没过。看着时间还剩下半个小时就想尝试一下改变快排基准值,结果莫名 A 了。就算是出了考场我也没想通问题到底在哪儿……

如果说这次上机能提供什么经验的话,我想应该有三点:

  1. 不要被身边的人干扰了心态,看到身边的人一个个走了真的会对心态造成干扰。
  2. 附加题不要莽,最好在做完前面的题后静心看看,不然等前面的题做完了后看到附加题被自己瞎猜猜错了,就会很揪心。
  3. 平时要好好学算法(溜)

课下总结

常用宏命令

二维数组取地址

.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, 2char: 1byte,用 lb/sb
  • 递归:存储数据和恢复数据的顺序恰好相反