RISC-V 汇编代码实现阶乘递归函数 fact(n)
RISC-V 汇编代码实现阶乘递归函数 fact(n)
本文将展示使用 RISC-V 汇编语言实现阶乘函数 fact(n) 的递归过程。
首先,给出 C 语言代码实现:
long long int fact(long long int n)
{
if (n < 1) return (1);
else return (n * fact(n - 1));
}
(1) RISC-V 汇编代码
fact:
addi sp, sp, -16 # 分配栈空间
sw ra, 0(sp) # 保存返回地址
sw s0, 4(sp) # 保存 s0
addi s0, zero, 1 # s0 = 1
beqz a0, L1 # 如果 n < 1,跳转到 L1
addi sp, sp, -8 # 分配栈空间
sw a0, 0(sp) # 保存 n
addi a0, a0, -1 # n = n - 1
jal ra, fact # 调用 fact(n-1)
lw a0, 0(sp) # 恢复 n
addi sp, sp, 8 # 回收栈空间
mul s0, s0, a0 # s0 = s0 * n
L1:
lw s0, 4(sp) # 恢复 s0
lw ra, 0(sp) # 恢复返回地址
addi sp, sp, 16 # 回收栈空间
jr ra # 返回
(2) fact(5) 对应的实际执行的 RISC-V 代码
首先调用 fact(5),传入参数 $a0=5$。
因为 $a0>0$,所以进入 if 分支,调用 fact(4),传入参数 $a0=4$。
因为 $a0>0$,所以进入 if 分支,调用 fact(3),传入参数 $a0=3$。
因为 $a0>0$,所以进入 if 分支,调用 fact(2),传入参数 $a0=2$。
因为 $a0>0$,所以进入 if 分支,调用 fact(1),传入参数 $a0=1$。
因为 $a0>0$,所以进入 if 分支,调用 fact(0),传入参数 $a0=0$。
因为 $a0=0$,所以返回 1,fact(0) 执行完毕,返回到 fact(1)。
fact(1) 计算结果为 $s0=1*1=1$,返回到 fact(2)。
fact(2) 计算结果为 $s0=1*2=2$,返回到 fact(3)。
fact(3) 计算结果为 $s0=2*3=6$,返回到 fact(4)。
fact(4) 计算结果为 $s0=6*4=24$,返回到 fact(5)。
fact(5) 计算结果为 $s0=24*5=120$,执行完毕,程序结束。
原文地址: https://www.cveoy.top/t/topic/nxva 著作权归作者所有。请勿转载和采集!