The following code is rewritten so as the code for fact uses fewer instructions.
addi $sp, $sp, -8 #adjust stack for 2 items
sw $ra, 4($sp) #save return address
sw $a0, 0($sp) #save argument
slti $t0, $a0, 1 #test for n<1
beq $t0, $zero, L1
addi $v0, $zero, 1 #yes, result is 1
addi $sp, $sp, 8 #pop 2 items from stack
jr $ra #stack and return
L1:
addi $a0, $a0,-1 #else decrement n
jal fact #recursive call
lw $a0, 0($sp) # restore original n
lw $ra, 4($sp) #and return address
addi $sp, $sp, 8 #pop 2 items from stack
mul $v0, $a0, $v0 #multiply to get
jr $ra #result and return
Explanation:
Instruction | Description |
addi $sp, $sp, -8 | The stack is adjusted for two items. |
sw $ra, 4($sp) | Return address is saved. |
sw $a0, 0($sp) | Argument is saved. |
slti $t0, $a0, 1 | Tested if n is less than 1. |
addi $v0, $zero, 1 | Result is 1. |
addi $sp, $sp, 8 | Two items are popped from the stack. |
jr $ra | Stack and return. |
addi $a0, $a0, -1 | If result is no, decrement of 1. |
jal fact | Recursive call. |
lw $a0, 0($sp) | Restore original value of n |
lw $ra, 4($sp) | Return address |
addi $sp, $sp, 8 | Two items are popped from the stack. |
mul $v0, $a0, $v0 | Multiplied to get result |
jr $ra | Result and returns. |