Oder etwas eleganter, schneller (etwas loop unrolling zwecks "register renaming") und (hoffentlich) ohne pseudobefehle.
In $a0 wir der (positive) parameter n übergeben, die rückgabe erfolgt in $v0 und nur der inhalt von $t0, $t1 und $t2 wird verändert.
.text
.globl __start
__start:
ori $v0, $a0, 0 #für den fall n addi $t0, $a0, -2 #vergleichsgröße und zugleich anzahl der echten rechenschritte (falls nötig)
bltz $t0, fib_end #für n-2
ori $t1, $zero, 1 #f(n-1)=1
ori $t2, $zero, 0 #f(n-2)=0
fib_loop:
addu $v0, $t1, $t2 #f(n)=aus alten werten berechnen
beq $t0, $zero, fib_end #wenn letzter durchgang, $v0 zurückgeben
ori $t2, $v0, 0 #$t2 hat nun f(n-1), $t1 hat f(n-2)
addi $t0, $t0, -1 #zähler verringern
addu $v0, $t1, $t2 #f(n)=aus alten werten berechnen
beq $t0, $zero, fib_end #wenn letzter durchgang, $v0 zurückgeben
ori $t1, $v0, 0 #$t2 hat nun wieder f(n-2), $t1 hat f(n-1)
addi $t0, $t0, -1 #zähler verringern
j fib_loop
fib_end:
j $ra
mr.escape