# factorial.asm
# Function: int factorial(int num)
# Arguments: $a0 - num
# Returns: $v0 - result

.text
.globl factorial

factorial:
    addi $sp, $sp, -8     # Allocate stack space
    sw $ra, 4($sp)        # Save return address
    sw $s0, 0($sp)        # Save s0

    move $s0, $a0         # num -> s0
    li $v0, 1             # res = 1

factorial_loop:
    blez $s0, factorial_end  # if (i <= 0) exit loop
    mul $v0, $v0, $s0     # res = res * i
    addi $s0, $s0, -1     # i--

    j factorial_loop      # repeat loop

factorial_end:
    lw $s0, 0($sp)        # Restore s0
    lw $ra, 4($sp)        # Restore return address
    addi $sp, $sp, 8      # Free stack space
    jr $ra                # Return to caller
