下面是一个计算阶乘的递归过程:long long int factlong long int nifn 1 return 1;else return nfactn-1;写出 fact5对应的实际执行的 RISC-V 代码用不同的颜色区分递归层次。
.text fact: addi sp, sp, -16 # 分配栈空间 sw ra, 0(sp) # 保存返回地址 sw a0, 8(sp) # 保存参数 n li a1, 1 # 将 1 存入 a1 lw t0, 8(sp) # 将 n 加载到 t0 中 blt t0, a1, fact_end # 如果 n < 1,直接返回 1 addi a0, t0, -1 # 将 n-1 存入 a0 jal ra, fact # 递归调用 fact(n-1) lw t1, 0(sp) # 将返回地址加载到 t1 中 lw t0, 8(sp) # 将 n 加载到 t0 中 mul t0, t0, a0 # 计算 n*(n-1)! sw t0, 8(sp) # 将计算结果存入栈中 jr t1 # 返回到调用者 fact_end: li a0, 1 # 如果 n < 1,直接返回 1 lw ra, 0(sp) # 恢复返回地址 addi sp, sp, 16 # 释放栈空间 jr ra # 返回到调用者
调用 fact(5)
li a0, 5 jal ra, fact
结果存放在 a0
原文地址: https://www.cveoy.top/t/topic/crIE 著作权归作者所有。请勿转载和采集!