上机

主播这次真的认真准备了,求求了让我AK吧
新主楼的实验室你也拦不住我()
还是只过了两个题哈哈哈
但是是纯粹的翻译,
就是翻译过程中出现的傻逼问题
没救了孩子们

P2_Factory

数据范围较大,area需要用两个寄存器存储
考察multmflo``mfhi的用法.

P2_KIncreasing

我记得好像是又把一个sw打成lw

P2_FolderSize

这个是课下写的

  1. main开始前常量寄存器true没赋值.
  2. addr
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    int 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;
    }
    我为了省事,取没有重新计算addr
    但是在本题的情况下,这个间隔中有调用dfs,addr的值发生了改变,导致后续取得的e不正确.

课下

L0全排列

$a0,$a1,$a2是传递形参用的
进入函数之后立即将他们用别的寄存器存起来,避免污染
Right

1
2
3
fuction:
move index ,$a0
print("str")

Wrong
1
2
3
fuction:
print("str")#用到$a0,会有覆盖,影响输出
move index ,$a0

卡住的还是一些理所当然的小错,反而在逻辑上没有什么问题
对固定的一些宏或者用法还是不熟练

L1puzzle

  1. 计算偏移量用的是列数
    1
    2
    3
    4
    5
    6
    7
    #G[n][m] 当然为了省事可以将m作为一个固定的值放在宏里
    .macro getAddr(%ans,%i,%j,%m)
    mult %i,%m
    mflo %ans
    addu %ans,%ans,%j
    sll %ans,%ans,2
    .end_macro
  2. getInt读入的数据在$v0里
  3. cnt作为全局变量,不应该被压入栈中

    压入栈中的是不希望被改变的量

  4. 压栈的时候不要把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
2
3
4
5
6
7
8
9
10
11
12
cin = 0;
for(int j=0;j<=cnt;j++)
{
mul[j] *= i;//相乘
mul[j] += cin;//处理进位
cin = mul[j]/10;//得到新的进位
mul[j] %= 10;
if(mul[j]<0)
{
mul[j]+=10;
}
}

注意进位可能进的不止一位,其它位无需特别处理
但最高位,需要逐个处理,直至各部分只有一位

1
2
3
4
5
6
7
8
9
10
11
while(cin)
{
cnt++;//如果最后一位有进位,则当前位数+1
int num = cin%10;
if(num<0)
{
num+=10;
}
mul[cnt] = num;
cin /= 10;
}

notes

最后周日重写pre复习和写理论作业的时候,也发现了自己不熟悉的一些地方.

  1. sw是写入,读入的时候不能和lw弄混了
  2. 不能忘了end,尤其main后面是调用函数的时候.
  3. 使用数组的第二种方式:
    • 传入数组开头地址:
      1
      la $a0,array
    • 调用时
      1
      2
      3
      move $t1,$a0
      lw $t0,0($t1)
      addi $t1,$t1,4
  4. 递归函数要写push,pop($ra),不然找不到返回点
  5. 递归函数中间结束点和末尾都要加jr $ra
  6. push,pop基本操作不写错
    • push是先$sp -4sw
    • pop是先lw$sp 4