Seite 1 von 1

HÜ2 Josephus

Verfasst: 15. Nov 2009 15:21
von el_primo
Hallo,

ich habe den Algorithmus wie auf Folie 2-78 (fact) implementiert, aber letztendlich gibt mein Programm einen "Error in : invalid program counter value: 0" Fehler zurück. Was könnte das Problem sein?! Vermutlich geht etwas mit dem Stack schief. Ich habe 3 Worte Speicherplatz für $ra, n und k angepasst.

Re: HÜ2 Josephus

Verfasst: 15. Nov 2009 16:38
von ivoch
Vermutlich versuchst du in deinem Programm, irgendwas vom Stack in den $sp zu laden und dann dahin zu springen, bevor du überhaupt einen Wert im Stack gespeichert hast. Oder du hast dich mit den Offsets des $sp vertan und versuchst, einen Wert von n in den $sp zu laden und den richtigen Wert von $sp in den Register zu speichern, wo eigentlich n hingehört. Oder du hast vergessen, den $sp korrekt anzupassen.

Re: HÜ2 Josephus

Verfasst: 15. Nov 2009 20:47
von linn
Mach doch mal für n=k=2 im mars die schrittweise ausführung, damit du jeden befehl einzeln weiterschalten kannst.
Da wirste dann irgendwann sehn, dass jr $ra ausgeführt wird, ohne dass $ra gesetzt wurde.

Re: HÜ2 Josephus

Verfasst: 16. Nov 2009 12:39
von el_primo
Es hat mir aufgefallen, dass bei den rekursiven Aufrufen und nach der letzten Rückspeicherung der Rücksprungadresse $ra, springt jr $ra nochmal hinter dem jal und das Programm stürzt ab. Es wird also nicht erkannt, dass alle Argumente schon aufgerufen wurden. Was kann ich tun, um die Rekursion zu beenden?

Re: HÜ2 Josephus

Verfasst: 16. Nov 2009 12:42
von jan_k
rufe fact vor der eigentlich funktionsdefinition damit auf:

jal fact
end:
li $v0, 10
syscall

Re: HÜ2 Josephus

Verfasst: 16. Nov 2009 12:48
von el_primo
Ich verstehe nicht, was du meinst. Nach dem jal sollten die Argumente und die $ra rekursiv aufgerufen werden und so wird die Formel berechnet. Nach jedem rek. Aufruf steht jr $ra, damit der Keller angepasst werden kann.
Schon nach dem letztem Aufruf stürzt alles ab...

Re: HÜ2 Josephus

Verfasst: 16. Nov 2009 12:50
von el_primo
end:
li $v0, 10
syscall

das am Ende ist schon klar. Dieser Code wird aber bei mir nicht erreicht.

Re: HÜ2 Josephus

Verfasst: 16. Nov 2009 12:53
von jan_k
Wenn du einfach in deine Funktion "reinläufst" ohne einen jal Befehl in diese zu machen, weiß die Funktion beim letzten Jump, also dem Jump aus der Funktion nicht wohin sie springen soll und es kommt zu einem Fehler.
Man muss also verhindern, dass die Funktion ausgeführt wird ohne das hineingesprungen wird. Das geht am einfachsten mit einem end-Befehl direkt nach dem reinspringen.

Also sowas:

jal fact
end:
li $v0, 10
syscall

fact:
..
.
.

L1:
..

Re: HÜ2 Josephus

Verfasst: 16. Nov 2009 23:28
von newizz
Was macht konkret der Befehl "jal"?
noch nicht richtig kapiert.was ich weiß,er springt nach einem Label ,dort berchnet "etwas" also was die methode macht, und bringt das ergebnis zurück.

Re: HÜ2 Josephus

Verfasst: 16. Nov 2009 23:34
von mister_tt
Du weißt, was ein "normaler" Jump bzw. Branch-Befehl macht? Er springt einfach an die angegebene Adresse...

Ein jump-and-link-Befehl macht das Gleiche. Zusätzlich wird aber noch die Rücksprungadresse (pc + 4 -> also eine Zeile nach dem jal-Befehl) in $ra gespeichert.

Re: HÜ2 Josephus

Verfasst: 21. Nov 2009 04:59
von mickyloranger
newizz hat geschrieben:Was macht konkret der Befehl "jal"?
noch nicht richtig kapiert.was ich weiß,er springt nach einem Label ,dort berchnet "etwas" also was die methode macht, und bringt das ergebnis zurück.
"jal" macht alles wie "j" also Sprung nach "Label". Zusätzlich setzt automatisch den Pointer auf die nächte Zeile nach bem jal-Behefl.