以2!举例,首先来看一组用C写的阶乘代码:
for(i=1;i<=2;i++)
{
s=s*i;
}
其实逻辑很简单对吧,就是简单的for循环,变量i从1开始加,一直做累乘,直到i加至3退出循环,那么最终结果为s=1*2=2。那么接下来再看RISC-V汇编代码(指令集为RV32I):
main:
addi x10,x10,3
jal x1,fact
addi x10,x10,0
li a7,10
ecall
fact:
addi sp,sp,-16
sd x1,8(sp)
sd x10,0(sp)
addi x5,x10,-1
bge x5,x0,L1
addi x10,x0,1
addi sp,sp,16
jalr x0,x1,0
L1:
addi x10,x10,-1
jal x1,fact
addi x6,x10,0
ld x10,0(sp)
ld x1,8(sp)
addi sp,sp,16
mul x10,x10,x6
jalr x0,x1,0
emm…瞬间劝退对吧hhhh,不着急,一张图让你理解,会很绕(其实主要是有压栈和弹栈的概念在里面),最好还是自己用Ripes跑一下。