CS61c Spring2022 Project2

CS61C Spring2022 Project2 Guide

1.

最容易错的一点是:

在 C 语言中,如果 *p 是 int 类型的指针,指向一个 int Array

执行

1
p = p + 1;

的操作,实际上会让地址从 0x00 变成 0x04,相当于从 A[0] 跳到 A[1] , 也就是C 自动帮你处理了对于type 的偏移量

但是在 RISC-V 中,当 p 指向 0x00 时,执行 p + 1 只会得到 0x01, 并不是int 数组的下一位元素,需要手动乘以4以访问下一位元素

2.

venus 使用:

设置ebreak 断点之后,点击 run 才能到达断点处,可以在调试过程中重复点击 run

点击 step 会跳转到下一步,如果call function 则会单步进入到 function,而不能跳过 function

3.

在task 6的时候,写的测试需要把

1
raise NotImplementedError("TODO")

注释掉才能跑,然后最后一个测试malloc返回失败,a0 = 26,

测试malloc返回失败的例子:

传入数组长度为 0x7FFFFFFF (32bit 有符号数最大值)

4.task7

以下几个坑点:

1.fopen 返回的file discriptor 放在a0中,需要将其存入栈中,因为接下来的fread, fclose都需要 file discriptor作为参数传入,每次使用时需将file discriptor从栈中取出传入a0 ,每次a0都会被覆盖,所以需要备份

2.fread 的使用

需要注意的是 连续调用fread ,是相当于接着上次读文件的地方继续读的,例如第一次调用

fread ,读了4byte 读出 row ,那么接着再使用 fread ,同样传入 4 byte 即可

如果传入的参数非file discriptor , 返回值是0xFFFFFFFF,例如先把文件close之后再使用fread就会出现这种情况

3.查看一个二进制文件.bin 使用命令:

1
xxd -e filename.bin

替换掉filename.bin即可

5.task8

需要注意给write_matrix的参数a1是一个数据的地址,例如数组:

[1, 2, 3, 4, 5, 6, 7, 8, 9]

的地址,题目要求先写入行和列,因此需要另外malloc一个buffer 存入 row 和 column,将row 和 column写入文件后,再将数组中的所有元素写入

6. 评测截图

fail的那一项是calling convention检查,不知道哪里有问题

最后想说的是,这个项目是汇编写的数字识别,可惜最后应用的时候缺少提示给的文件夹,但是dump.py群里宇航员发过


本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 ,转载请注明出处!