Programmieren - alles kontrollieren 4.934 Themen, 20.613 Beiträge

fibonaccifolge in mips assembler

hategrown / 9 Antworten / Flachansicht Nickles

hi kann mir wer bei der implementierung der fibonaccifolge in assembler helfen :
die folge ist wie folgt definiert :

für n=0 f(n)=0, für n=1 f(n)=1
für n>=2 : f = f(n-1)+f(n+2)

krieg dass einfach nicht gebacken, bin für jeden lösungsvorschlag sehr dankbar

mfg hategrown

bei Antwort benachrichtigen
mr.escape Nachtrag zu: „Vielleicht so? start a0 n rückgabe in v0 zerstört inhalt von t0, t1, t2 und...“
Optionen

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

"The man who trades freedom for security does not deserve nor will he ever receive either." - Benjamin Franklin"Wer seine Freiheit aufgibt, um Sicherheit zu erreichen, wird beides verlieren." - Georg Christoph Lichtenberg
bei Antwort benachrichtigen