# This program computes factorial using tail call # # Input: n must be a positive integer # Output: n! # # main program # print prompt # read n # call fact(n,1) # print the value of n! # exit # .data .align 2 # input prompt string prmpt: .asciiz "\n\nEnter value for n: " # output descriptor descr: .asciiz "\nn! = " .text .align 2 .globl main main: # print prompt li $v0, 4 # system service print_string la $a0, prmpt # pass the string syscall # read n li $v0, 5 # system service read_int syscall # n is in $v0 # call fact(n, 1) move $a0, $v0 # pass n, first arg. li $a1, 1 # pass 1, second arg. jal fact # call fact, result in $v0 # print result move $s0, $v0 # move result to $s0 li $v0, 4 # system service print_string la $a0, descr # pass the string syscall li $v0, 1 # system service print_int move $a0, $s0 # pass the result syscall # exit li $v0, 10 # system service exit syscall # # C code: # # % fact(n,1) returns n! where n>0 # % # int fact(int n, int prod) { # if n == 1 # return prod; # else # fact(n-1, n*prod); # } # # register usage: # $a0 = n # $a1 = prod # # side effect: # $a0 and $a1 are changed on return # fact: li $t1, 1 bne $a0, $t1, factne1 # if $a0=1 move $v0, $a1 # return the second arg jr $ra factne1: # else mul $a1, $a1, $a0 # $a1 = prod*n addi $a0, $a0, -1 # $a0 = n - 1 j fact # tail call fact