CS61c Spring2022 Project2
CS61C Spring2022 Project2 Guide
1.
最容易错的一点是:
在 C 语言中,如果 *p 是 int 类型的指针,指向一个 int Array
执行
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 |
|
注释掉才能跑,然后最后一个测试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 |
|
替换掉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 协议 ,转载请注明出处!