# Example of function recursion # # this program computes 4! (factorial of 4) with recursion. # it illustrates how to set up the procedure stack # .text li $a0,4 # compute 4! jal fac move $a0,$v0 # get result li $v0,1 # print integer syscall li $v0,10 syscall # # fac(arg) - computes factorial of arg (arg!) # argument is passed in $a0 # stack frame: # # | ...high address... | # |--------------------| # | | # |--------------------| # | return address | +4 # |--------------------| # $sp->| saved $s0 | +0 # |--------------------| # | ...low address... | # # fac: # prologue to procedure addi $sp,$sp,-8 # push space for activation frame sw $s0,0($sp) # save $s0, which we use sw $ra,4($sp) # save return address # start of actual procedure work move $s0,$a0 # get argument ($a0) li $v0,0x00000001 # 1 beq $s0,$v0,L2 # end of recursion? addi $a0,$s0,-1 # set up argument (f-1) jal fac # recursive call mult $v0,$s0 # multiply mflo $v0 # return mul result j L3 # exit procedure via epilogue L2: li $v0,0x00000001 # return value # epilogue to exit procedure L3: lw $ra,4($sp) # restore $ra lw $s0,0($sp) # restore $s0 addi $sp,$sp,8 # pop activation frame jr $ra # return