RISC-V递归的两种实现

说明

计算机组成课件的例题2-16要求用RISC-V汇编语言改写一个实现阶乘计算的C语言递归程序,但题目给出的代码不很容易理解。我采用了一种等价的、我自认为更符合逻辑的写法。代码经微调在Venus上测试,认为无误。放在这里,希望读者不吝指正。如果没有我的其他联系方式,可以用主页上的邮件联系我。

C语言代码:

int fact(int n) {
    if (n < 1) return 1;
    else return n * fact(n - 1);
}

幻灯片中的RISC-V汇编代码:

fact: addi sp sp -16
sd a0 8(sp)
sd ra 0(sp)
addi t0 a0 -1
bge t0 zero L1 # a0 - 1 >= 0
addi a0 zero 1 # a0 <= 0 return 1
addi sp sp 16
jalr zero 0(ra)

L1: addi a0 a0 -1
jal ra fact
add t1 a0 zero
ld a0 8(sp)
ld ra 0(sp)
add sp sp 16
mul a0 a0 t1
jalr zero 0(ra)

我的修改:

fact: addi sp sp -16
sd a0 8(sp)
sd ra 0(sp)
addi a0 a0 -1
bge zero a0 L1 # jump when original a0 - 1 <= 0
jal ra fact
add t1 a0 zero
addi sp sp 16
ld a0 8(sp)
ld ra 0(sp)
mul a0 a0 t1
jalr zero 0(ra)

L1: addi a0 zero 1
jalr zero 0(ra)