# Lab1: RV32I Simulator ![](https://hackmd.io/_uploads/BJIb0Z8ya.png) [Ripes](https://github.com/mortbopet/Ripes) is a graphical RISC-V pipeline simulator & assembly editor. > video: [Ripes: Teaching Computer Architecture Through Visual and Interactive Simulators](https://youtu.be/yEw-S8J-LkI) > Download via https://github.com/mortbopet/Ripes/releases > :information_source: You can download via [AppImage](https://appimage.org/) form, allowing instant execution without superuser permission on various Linux distributions. > You can even use [web browser to run Ripes](https://ripes.me/). > :warning: Ripes might not work on Apple Silicon. The following example shows an implementation of the mathematical factorial function (`!` function) to find the factorial value of $7! = 5040$. The factorial function can be written as a recursive function call. Recall that fact(n) = n × (n – 1) × (n – 2) × … × 2 × 1. The `fact` function can be rewritten recursively as fact(n) = n × fact(n – 1). ```c .data argument: .word 7 # Store the initial value (7) for which we want to compute the factorial str1: .string "Factorial value of " # First part of the output message str2: .string " is " # Second part of the output message .text main: lw a0, argument # Load the argument (7) into register a0 jal ra, fact # Jump-and-link to the 'fact' function to compute factorial # Prepare to print the result mv a1, a0 # Move the result (factorial) from a0 to a1 for printing lw a0, argument # Reload the original argument into a0 to print it # Call the function to print the result jal ra, printResult # Exit the program li a7, 10 # System call code for exiting the program ecall # Make the exit system call # Recursive function to compute factorial # a0: Input argument (number for which factorial is to be calculated) fact: addi sp, sp, -16 # Allocate stack space for local variables (ra and a0) sw ra, 8(sp) # Save return address (ra) on the stack sw a0, 0(sp) # Save input argument (a0) on the stack addi t0, a0, -1 # Check if a0 > 0 by subtracting 1 bge t0, zero, nfact # If a0 >= 1, jump to 'nfact' to continue recursion # Base case: factorial(0) = 1 addi a0, zero, 1 # Set a0 = 1 as factorial(0) = 1 addi sp, sp, 16 # Restore stack jr x1 # Return to the caller nfact: addi a0, a0, -1 # Decrement a0 (input) by 1 for recursive call jal ra, fact # Recursive call to 'fact' function addi t1, a0, 0 # Store the result of factorial(n-1) in t1 # Restore the previous state before returning lw a0, 0(sp) # Load the original value of a0 (n) from the stack lw ra, 8(sp) # Restore return address (ra) addi sp, sp, 16 # Deallocate stack space # Multiply the current value of n with factorial(n-1) mul a0, a0, t1 # a0 = a0 * t1, where t1 contains factorial(n-1) ret # Return to the caller with factorial(n) # This function prints the factorial result in the format: # "Factorial value of X is Y", where X is the original number and Y is the computed factorial # a0: The original input value (X) # a1: The computed factorial result (Y) printResult: mv t0, a0 # Save original input value (X) in temporary register t0 mv t1, a1 # Save factorial result (Y) in temporary register t1 la a0, str1 # Load the address of the first string ("Factorial value of ") li a7, 4 # System call code for printing a string ecall # Print the string mv a0, t0 # Move the original input value (X) to a0 for printing li a7, 1 # System call code for printing an integer ecall # Print the integer (X) la a0, str2 # Load the address of the second string (" is ") li a7, 4 # System call code for printing a string ecall # Print the string mv a0, t1 # Move the factorial result (Y) to a0 for printing li a7, 1 # System call code for printing an integer ecall # Print the integer (Y) ret # Return to the caller ``` The console will output: ``` Factorial value of 7 is 5040 ```