This program computes and displays the factorial of n, where n is entered by the user. The program prompts for new values of n until the user enters a negative number.
The fact.s program can be viewed as a text file by clicking here. After the file appears in a new tab or window it can be saved using your browser's file menu.
# This program computes and displays the factorial of n, where n is entered
# by the user. The program prompts for new values of n until the user
# enters a negative number.
#
# Note: results are valid only for small values of n.
#
.globl main
.data
# main program string constants
#
prompt: .asciiz "Please enter a positive integer: "
result: .asciiz "! = "
newline: .asciiz "\n"
done: .asciiz "Program terminated."
.text
# main program
#
# Register usage:
#
# n: $s0
# factorial: $s1
#
main:
li $v0, 4 # issue prompt
la $a0, prompt
syscall
la $v0, 5 # get n from user
syscall
move $s0, $v0
bltz $v0, end # terminate if n < 0
move $a0, $s0 # nFact = factorial(n)
jal factorial
move $s1, $v0
li $v0, 1 # print n
move $a0, $s0
syscall
li $v0, 4 # print "! = "
la $a0, result
syscall
li $v0, 1 # print nFact
move $a0, $s1
syscall
li $v0, 4 # print two newlines
la $a0, newline
syscall
li $v0, 4
la $a0, newline
syscall
b main # repeat with new n
end:
li $v0, 4 # print a termination message
la $a0, done
syscall
li $v0, 4 # print a newline
la $a0, newline
syscall
li $v0, 10 # terminate the program
syscall
# function factorial
#
# C synopsis:
#
# int factorial(int n)
#
# Typical C call:
#
# nFact = factorial(n);
#
# Effect:
#
# Puts n! into nFact.
#
# MAL call sequence assuming n is $s0, nFact is $s1:
#
# move $a0, $s0
# jal factorial
# move $s1, $v0
#
# Stack usage:
#
# return address ($ra) saved at 0($sp)
# n ($a0) saved at 4($sp)
#
factorial:
bgtz $a0, recur # recur if n > 0
li $v0, 1 # else just return 1
jr $ra
recur:
sub $sp, $sp, 8 # allocate stack frame
sw $ra, 0($sp) # with return address at 0($sp)
sw $a0, 4($sp) # and n at 4($sp)
sub $a0, $a0, 1 # $v0 = factorial(n - 1)
jal factorial
lw $ra, 0($sp) # restore return address
lw $a0, 4($sp) # and n from the stack frame
add $sp, $sp, 8 # and deallocate it
mul $v0, $v0, $a0 # return factorial(n - 1)*n
jr $ra