factorial:
addi t0, zero 2
bgeu a0, t0, work // if (n >= 2) goto work
addi a0, zero, 1 // 1
jalr zero, 0(ra) // return (1)
work:
addi sp, sp, -16
sd ra, 0(sp) // save ra
sd a0, 8(sp) // and n
addi a0, a0, -1 // n-1
jal ra, factorial // factorial(n-1)
ld t0, 8(sp) // t0 = n
mul a0, a0 t0 // (n-1)! * n
ld ra, 0(sp) // restore ra
addi sp, sp, 16 // clean stack
jalr x0, 0(ra) // return ((n-1)! * n)