Hey. Hat es einer von euch gebacken bekommen, den Türme von Hanoi Algo für das RS Praktikum in Assembler umzuwandeln? Mir will die Rekursion (schon in Java) ums verrecken nicht gänzlich klar werden, eine Umsetzung in Assembler (mit stack) schon garnicht. :/
Hilfe jeglicher Art wäre ganz nett.
Mir will die Rekursion (schon in Java) ums verrecken nicht gänzlich klar werden
Schritt 0: Befrage Google nach "Rekursion".
Schritt 1: Mache Dir klar, wie eine Methode a eine Methode b aufrufen kann, welche wiederrum eine Methode c aufruft. Wie merkt sich der Computer, an welcher Stelle a unterbrochen wurde, damit beim Beenden von b an der Stelle nach dem Aufruf von b weitergemacht werden kann? Analog für die Unterbrechung von b durch c.
Da diese Verschachtelung im Prinzip beliebig tief sein kann, kann man den Unterbrechungsort nicht irgendwo in einer festen Adresse speichern, sondern man braucht dazu einen Stack.
Schritt 2: Mache Dir klar, dass die formalen Parameter ebenso nicht feste Adressen zugewiesen bekommen können, weil ein rekursiver Aufruf sonst die eigenen formalen Parameter überschreiben würde. Auch diese müssen also auf einem Stack landen - warum also nicht den gleichen verwenden, den man schon in Schritt 1 herbeigesehnt hat?
Schritt 3: Analog für lokale Variablen - formale Parameter sind ja nichts anderes als von außen initialisierte lokale Variablen. Diese drei Elemente (Rücksprungadresse, formale Parameter, lokale Variablen) werden in einer Strutkur namens "Stack Frame" auf dem Stack abgelegt.
Schritt 4: Schreibe eine einfache rekursive Funktion, setze einen Haltepunkt im Funktionsrumpf und starte den Debugger von BlueJ. Das sollte die letzten Zweifel beseitigen.
In der Assembleraufgabe gibt es mit Sicherheit ebenfalls einen Stack. Wie dieser genau aussieht, weiß ich aber nicht, dafür ist das T3 Praktikum einfach schon zu lange her. Wenn Du konkrete Fragen hast, poste sie.
also wenn das immer noch die sparc ist:
am anfang der eigenen prozedur:
save %sp, -104, %sp
um die rücksprungadresse zu sichern. (man kriegt glaub ich auch noch 104 [speichereinheit] speicher, weiss ich nicht mehr genau.) die parameter liegen in den registern %i0, %i1, …
dann kann man beliebig unterprozeduren - auch sich selbst natürlich - aufrufen: (mit den parametern in %o0, %o1, …)
call prozedur
nop
wenn man fertig ist muss man die rücksprungadresse wiederholen und dahin springen:
restore
jmp %o7+8
nop
(die rückgabewerte liegen hierbei wieder in den registern %i0, %i1, …)
also wenn das immer noch die sparc ist:
Praktikum. Das war nie Sparc und wird auch nie Sparc werden. DCore ruled [10]
Praktikum.
achja. hm, dann muss man das halt selber machen.
Ach ja, hab das Problem gelöst :D. Danke für euere Antworten.