# Author: Danny Krizanc # Creation date: 02/23/07 # Recursive factorial algorithm # Works only upto n=12; note that fact(13) = 6,227,020,800 > largest int # Define data to be used in the ".data" section. .data prompt: .asciiz "\n Enter integer:" #input prompt result: .asciiz "\n Factorial of input: " #result prompt .text main: li $v0, 4 #Prompt user for input la $a0, prompt syscall li $v0, 5 syscall add $a0, $v0, $zero #store input in $a0 procedure arg jal fact #call recursive factorial add $s0, $v0, $zero #store result in $s0 li $v0, 4 #Print result la $a0, result syscall li $v0, 1 add $a0, $s0, $zero syscall li $v0, 10 #exit syscall fact: addi $sp, $sp, -8 #store called value and return address sw $ra, 4($sp) #on stack sw $a0, 0($sp) slti $t0, $a0, 1 #check for base case beq $t0, $zero, L1 addi $v0, $zero, 1 #base case: return 1 addi $sp, $sp, 8 #restore stack pointer jr $ra #return to caller L1: addi $a0, $a0, -1 #inductive case, call with arg n-1 jal fact lw $a0, 0($sp) #restore arg lw $ra, 4($sp) #restore return address addi $sp, $sp, 8 #restore stack pointer mul $v0, $a0, $v0 #recursive case: return n*fact(n-1) jr $ra