P2总结
上机
主播这次真的认真准备了,求求了让我AK吧
新主楼的实验室你也拦不住我()
还是只过了两个题哈哈哈
但是是纯粹的翻译,
就是翻译过程中出现的傻逼问题
没救了孩子们
P2_Factory
数据范围较大,area需要用两个寄存器存储
考察mult后mflo``mfhi的用法.
P2_KIncreasing
我记得好像是又把一个sw打成lw了
P2_FolderSize
这个是课下写的
main开始前常量寄存器true没赋值.addr我为了省事,取没有重新计算addr1
2
3
4
5
6
7
8
9
10
11
12
13int dfs_sum(int u) {
if (nodeType[u] == 0){
return fileSizeVal[u];
}
int size = 0;
for (int e = headAdj[u]; e != -1; e = nextEdge[e]){
int v = toEdge[e];
//取addr=e<<2
size += dfs_sum(v);
//有dfs递归调用,addr在调用过程中发生了改变,如果没有push(addr)的话需要重新取addr
}//更新e=nextEdge[e];addr仍然=e<<2
return size;
}
但是在本题的情况下,这个间隔中有调用dfs,addr的值发生了改变,导致后续取得的e不正确.
课下
L0全排列
$a0,$a1,$a2是传递形参用的
进入函数之后立即将他们用别的寄存器存起来,避免污染
Right1
2
3fuction:
move index ,$a0
print("str")
Wrong1
2
3fuction:
print("str")#用到$a0,会有覆盖,影响输出
move index ,$a0
卡住的还是一些理所当然的小错,反而在逻辑上没有什么问题
对固定的一些宏或者用法还是不熟练
L1puzzle
- 计算偏移量用的是列数
1
2
3
4
5
6
7#G[n][m] 当然为了省事可以将m作为一个固定的值放在宏里
getAddr(%ans,%i,%j,%m)
mult %i,%m
mflo %ans
addu %ans,%ans,%j
sll %ans,%ans,2
.end_macro - getInt读入的数据在$v0里
cnt作为全局变量,不应该被压入栈中
压入栈中的是不希望被改变的量
压栈的时候不要把push复制粘贴到pop里了
L1factorial
阶乘:大数乘小数
这里新学习到一个取余的操作:1
2
3
4#计算:c=a%b d=a/b
div $t0,$t1#a/b
mflo $t2#d
mfhi $t3#c
先写一个C语言的代码,再翻译就好了
逐位处理,对于每一位
1 | cin = 0; |
注意进位可能进的不止一位,其它位无需特别处理
但最高位,需要逐个处理,直至各部分只有一位1
2
3
4
5
6
7
8
9
10
11while(cin)
{
cnt++;//如果最后一位有进位,则当前位数+1
int num = cin%10;
if(num<0)
{
num+=10;
}
mul[cnt] = num;
cin /= 10;
}
notes
最后周日重写pre复习和写理论作业的时候,也发现了自己不熟悉的一些地方.
sw是写入,读入的时候不能和lw弄混了- 不能忘了end,尤其
main后面是调用函数的时候. - 使用数组的第二种方式:
- 传入数组开头地址:
1
la $a0,array
- 调用时
1
2
3move $t1,$a0
lw $t0,0($t1)
addi $t1,$t1,4
- 传入数组开头地址:
- 递归函数要写push,pop($ra),不然找不到返回点
- 递归函数中间结束点和末尾都要加jr $ra
- push,pop基本操作不写错
push是先$sp -4再swpop是先lw再$sp 4
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来源 PlutoC!

