MIPS Assembly Language Programming
MIPS Assembly Language Programming
MIPS Assembly Language Programming
Create successful ePaper yourself
Turn your PDF publications into a flip-book with our unique Google optimized e-Paper software.
46 CHAPTER 3. ADVANCED <strong>MIPS</strong> TUTORIAL<br />
# fib-- (callee-save method)<br />
# Registers used:<br />
# $a0 - initially n.<br />
# $s0 - parameter n.<br />
# $s1 - fib (n - 1).<br />
# $s2 - fib (n - 2).<br />
.text<br />
fib:<br />
subu $sp, $sp, 32 # frame size = 32, just because...<br />
sw $ra, 28($sp) # preserve the Return Address.<br />
sw $fp, 24($sp) # preserve the Frame Pointer.<br />
sw $s0, 20($sp) # preserve $s0.<br />
sw $s1, 16($sp) # preserve $s1.<br />
sw $s2, 12($sp) # preserve $s2.<br />
addu $fp, $sp, 32 # move Frame Pointer to base of frame.<br />
move $s0, $a0 # get n from caller.<br />
blt $s0, 2, fib_base_case # if n < 2, then do base case.<br />
sub $a0, $s0, 1 # compute fib (n - 1)<br />
jal fib #<br />
move $s1, $v0 # s1 = fib (n - 1).<br />
sub $a0, $s0, 2 # compute fib (n - 2)<br />
jal fib<br />
move $s2, $v0 # $s2 = fib (n - 2).<br />
add $v0, $s1, $s2 # $v0 = fib (n - 1) + fib (n - 2).<br />
b fib_return<br />
fib_base_case: # in the base case, return 1.<br />
li $v0, 1<br />
fib_return:<br />
lw $ra, 28($sp) # restore the Return Address.<br />
lw $fp, 24($sp) # restore the Frame Pointer.<br />
lw $s0, 20($sp) # restore $s0.<br />
lw $s1, 16($sp) # restore $s1.<br />
lw $s2, 12($sp) # restore $s2.<br />
addu $sp, $sp, 32 # restore the Stack Pointer.<br />
jr $ra # return.<br />
As a baseline test, let’s time the execution of this program computing the F (20):