3-CS61C项目笔记-Lab4-用指针编写RISCV函数
Exercise 1
原代码:
1 | map: |
纠错
数组偏移量不对
1
2
3
4
5
6
7
8
9before:
add t1, t1, t0 # offset the array address by the count
lw a0, 0(t1) # load the value at that address into a0
after:
li t3, 4
mul t4, t0, t3
add t1, t1, t4 # offset the array address by the count
lw a0, 0(t1) # load the value at that address into a0调用函数时没有及时存储
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21before:
jalr s1 # call the function on that value.
after:
addi sp, sp, -24
sw ra, 0(sp)
sw s1, 4(sp)
sw s0, 8(sp)
sw t1, 12(sp)
sw t2, 16(sp)
sw t0, 20(sp)
jalr s1 # call the function on that value.
lw t0, 20(sp)
lw t2, 16(sp)
lw t1, 12(sp)
lw s0, 8(sp)
lw s1, 4(sp)
lw ra, 0(sp)
addi sp, sp, 24加载下一node地址进入a0错误
1
2
3
4before:
la a0, 8(s0) # load the address of the next node into a0
after:
lw a0, 8(s0)修改前
8(s0)
的写法并不适用于la
指令,因为la
指令的参数是一个符号(例如标签或变量名),而不是偏移地址。正确的用法应该是像la a0, symbol
这样的形式。加载返回函数地址错误
1
2
3
4
5before:
lw a1, 0(s1) # put the address of the function back into a1 to prepare for the recursion
after:
add a1, s1, x0add t0, s0, x0
的结果是t0 = s0 + x0
,实际上等价于t0 = s0
,因为x0
永远是0。lw t0, 0(s0)
的结果是将内存地址s0
中的数据加载到t0
。加载当前node地址错误
1
2
3
4
5before:
add t1, s0, x0 # load the address of the array of current node into t1
after:
lw t1, s0, 0(x0)add t0, s0, x0
的结果是t0 = s0 + x0
,实际上等价于t0 = s0
,因为x0
永远是0。lw t0, 0(s0)
的结果是将内存地址s0
中的数据加载到t0
。
Exercise 2
1 | f: |
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 云泥小窝!
评论