# # program to define and test factorial fcn # .text .globl main main: # # opening linkage (save return address) # addi $sp, $sp, -4 sw $ra, 0($sp) # # prompt # la $a0, prompt li $v0, 4 # "print string" syscall syscall # # get input # # $s0 will hold input li $v0, 5 # "read int" syscall syscall addi $s0, $v0, 0 # save result in $s0 # # compute factorial of input, putting result in $s1 # addi $a0, $s0, 0 # parameter is input jal factorial addi $s1, $v0, 0 # copy return value # print results # in almost-C: printf("factorial of %d is %d\n", $s0, $s1) la $a0, answer_txt1 li $v0, 4 # "print string" syscall syscall addi $a0, $s0, 0 # get saved input li $v0, 1 # "print int" syscall syscall la $a0, answer_txt2 li $v0, 4 # "print string" syscall syscall addi $a0, $s1, 0 # get saved result li $v0, 1 # "print int" syscall syscall la $a0, nl li $v0, 4 # "print string" syscall syscall # # closing linkage (get return address and restore stack pointer) # lw $ra, 0($sp) addi $sp, $sp, 4 jr $ra .end main # # factorial function: # factorial: # # opening linkage (save return address and registers) # addi $sp, $sp, -4 sw $ra, 0($sp) addi $sp, $sp, -32 sw $s0, 0($sp) sw $s1, 4($sp) sw $s2, 8($sp) sw $s3, 12($sp) sw $s4, 16($sp) sw $s5, 20($sp) sw $s6, 24($sp) sw $s7, 28($sp) # # do computation and set return value # # in C: # int factorial(int n) { # if (n <= 0) return 1; # else return n * factorial(n-1); # } # rewrite in MIPS-friendly C # use $s0 to hold parameter (n) addi $s0, $a0, 0 # if (n > 0) goto notbase slt $t0, $zero, $s0 # $t0 is 1 if 0 < n, 0 otherwise bne $t0, $zero, notbase # returnval = 1 addi $v0, $zero, 1 # goto end j end notbase: # temp = factorial(n-1) addi $a0, $s0, -1 # parameter n-1 jal factorial # $v0 has temp # returnval = n * temp mul $v0, $s0, $v0 # goto end end: # # closing linkage # lw $s7, 28($sp) lw $s6, 24($sp) lw $s5, 20($sp) lw $s4, 16($sp) lw $s3, 12($sp) lw $s2, 8($sp) lw $s1, 4($sp) lw $s0, 0($sp) addi $sp, $sp, 32 lw $ra, 0($sp) addi $sp, $sp, 4 # return to caller jr $ra .end factorial # # area for variables and constants # .data prompt: .asciiz "Enter an integer:\n" answer_txt1: .asciiz "factorial of " answer_txt2: .asciiz " is " nl: .asciiz "\n"