HÜ2 Josephus
HÜ2 Josephus
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.
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.
The idea of style and competing for the best style is key to all forms of rocking
Re: HÜ2 Josephus
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
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.
Da wirste dann irgendwann sehn, dass jr $ra ausgeführt wird, ohne dass $ra gesetzt wurde.
Re: HÜ2 Josephus
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?
The idea of style and competing for the best style is key to all forms of rocking
Re: HÜ2 Josephus
rufe fact vor der eigentlich funktionsdefinition damit auf:
jal fact
end:
li $v0, 10
syscall
jal fact
end:
li $v0, 10
syscall
Re: HÜ2 Josephus
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...
Schon nach dem letztem Aufruf stürzt alles ab...
The idea of style and competing for the best style is key to all forms of rocking
Re: HÜ2 Josephus
end:
li $v0, 10
syscall
das am Ende ist schon klar. Dieser Code wird aber bei mir nicht erreicht.
li $v0, 10
syscall
das am Ende ist schon klar. Dieser Code wird aber bei mir nicht erreicht.
The idea of style and competing for the best style is key to all forms of rocking
Re: HÜ2 Josephus
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:
..
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
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.
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.
It's your ATTITUDE and not your APTITUDE that determines your ALTITUDE
Re: HÜ2 Josephus
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.
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.
-
- Erstie
- Beiträge: 15
- Registriert: 13. Okt 2009 21:10
Re: HÜ2 Josephus
"jal" macht alles wie "j" also Sprung nach "Label". Zusätzlich setzt automatisch den Pointer auf die nächte Zeile nach bem jal-Behefl.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.