# factorial.asm calculates the factorial of 5 .data str: .asciiz "Factorial of 5 is " .text .globl main main: subu $sp, $sp, 32 # create activation record for main sw $ra, 20($sp) # save return address sw $fp, 16($sp) # save frame pointer addi $fp, $sp, 28 # adjust frame pointer li $a0, 5 # pass 5 as argument to fact jal fact # call fact procedure move $s0, $v0 # save result of fact la $a0, str # print output label for result li $v0, 4 syscall move $a0, $s0 # print result li $v0, 1 syscall lw $fp, 16($sp) # restore frame pointer lw $ra, 20($sp) # restore return address addi $sp, $sp, 32 # destroy activation record jr $ra # end the program fact: subu $sp, $sp, 32 sw $ra, 20($sp) sw $fp, 16($sp) addi $fp, $sp, 28 li $t1, 1 slt $t0, $a0, $t1 beq $t0, $zero, L1 li $v0, 1 j Exit L1: sw $a0, 0($sp) # move $s2, $a0 subu $a0, $a0, 1 jal fact lw $a0, 0($sp) # move $a0, $s2 mul $v0, $a0, $v0 Exit: lw $fp, 16($sp) lw $ra, 20($sp) addi $sp, $sp, 32 jr $ra