# long int factorial(int n) { # if (n!=1) # return n * factorial(n-1); # else # return 1; # } .globl main .data n: .word 4 .text main: la t0, n lw a0, 0(t0) jal ra, factorial addi a1, a0, 0 addi a0, x0, 1 ecall # Print Result addi a0, x0, 10 ecall # Exit factorial: addi sp, sp, -8 # Function prologue sw ra, 0 (sp) sw s0, 4 (sp) addi s0, x0, 1 recursion: li t0,1 beq a0, t0, finish mv s0,a0 # Saving a0 as required across call. Not saving t0 as is it not required across call. addi a0, a0, -1 jal factorial mv t0,a0 # Not a0 here contains return value from factorial. mv a0,s0 # Not s0 contains the value of a0 before recursive call i.e., the parameter passed in. mul a0,a0,t0 # finish: # Make sure return value in a0 whether beq taken or not. # Function Epilogue lw ra, 0 (sp) lw s0, 4 (sp) addi sp, sp, 8 jr ra