HÜ2 Josephus

Benutzeravatar
el_primo
Windoof-User
Windoof-User
Beiträge: 38
Registriert: 8. Nov 2005 00:42

HÜ2 Josephus

Beitrag 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.
The idea of style and competing for the best style is key to all forms of rocking

ivoch
Endlosschleifenbastler
Endlosschleifenbastler
Beiträge: 199
Registriert: 3. Mär 2004 10:51

Re: HÜ2 Josephus

Beitrag 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.

linn
Mausschubser
Mausschubser
Beiträge: 77
Registriert: 15. Okt 2008 21:16

Re: HÜ2 Josephus

Beitrag 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.

Benutzeravatar
el_primo
Windoof-User
Windoof-User
Beiträge: 38
Registriert: 8. Nov 2005 00:42

Re: HÜ2 Josephus

Beitrag 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?
The idea of style and competing for the best style is key to all forms of rocking

Benutzeravatar
jan_k
Mausschubser
Mausschubser
Beiträge: 66
Registriert: 7. Jul 2009 15:39
Kontaktdaten:

Re: HÜ2 Josephus

Beitrag von jan_k »

rufe fact vor der eigentlich funktionsdefinition damit auf:

jal fact
end:
li $v0, 10
syscall

Benutzeravatar
el_primo
Windoof-User
Windoof-User
Beiträge: 38
Registriert: 8. Nov 2005 00:42

Re: HÜ2 Josephus

Beitrag 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...
The idea of style and competing for the best style is key to all forms of rocking

Benutzeravatar
el_primo
Windoof-User
Windoof-User
Beiträge: 38
Registriert: 8. Nov 2005 00:42

Re: HÜ2 Josephus

Beitrag von el_primo »

end:
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

Benutzeravatar
jan_k
Mausschubser
Mausschubser
Beiträge: 66
Registriert: 7. Jul 2009 15:39
Kontaktdaten:

Re: HÜ2 Josephus

Beitrag 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:
..

Benutzeravatar
newizz
Sonntagsinformatiker
Sonntagsinformatiker
Beiträge: 209
Registriert: 30. Jun 2009 16:41

Re: HÜ2 Josephus

Beitrag 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.
It's your ATTITUDE and not your APTITUDE that determines your ALTITUDE

mister_tt
Kernelcompilierer
Kernelcompilierer
Beiträge: 502
Registriert: 29. Sep 2008 15:54

Re: HÜ2 Josephus

Beitrag 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.

mickyloranger
Erstie
Erstie
Beiträge: 15
Registriert: 13. Okt 2009 21:10

Re: HÜ2 Josephus

Beitrag 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.

Antworten

Zurück zu „Archiv“