Forum: Mikrocontroller und Digitale Elektronik Ret und Call klappt nicht! Warum?


von noname (Gast)


Lesenswert?

Habe gerade ein program für einen AT90S8515 im Assembler und Emulator
getestet. Aber der ret befehl klappt nicht, er springt immer irgendwo
hin wo er nicht soll.
Bin leider anfänger auf dem Atmel, woran kann das liegen?
Könnte das problem am nicht festgelegten Stackpointer liegen?

Kann mir das mal jemand bitte veranschaulichen.
Danke

von Johannes Raschke (Gast)


Lesenswert?

Hi!

Ja, das wird am Stackpointer (SP)liegen.
Dieser Pointer ist im Prinzip eine Variable. Darin enthalten ist die
Adresse einer Speicherstelle. Darum sagt man, der SP "zeigt auf"
diese Adresse im RAM.
Wen Du nun einen call machst, wird der akutelle Wert des Befehlszeigers
(eine andere Variable, die die Speicheradresse des gerade bearbeiteten
Befehls enthält) an die Adresse geschrieben, auf die der SP zeigt.
Danach wird der SP um eins erniedrigt.
Bei dem folgenden ret - Anweisung wird der SP wieder um eins erhöht und
zeigt dann also  wieder auf die Speicherzelle, wo der  Befehlszeiger
(IP) gespeichert ist. Dieser wird anschließend zurückgelesen. Auf diese
Weise "weiß" der Controller wieder, wo er weitermachen soll.
Weil der SP ja bei jedem call um eins erniedrigt wird, muß man ihm ganz
am Anfang auf das Ende, nicht den Anfang des RAMs setzen. Bevor man
dies tut, darf man kein call verwenden!

Bei den Befehlen "push" und "pop" wird übrigens der Operand an die
Adresse des SP geschrieben (bzw. daher gelesen) anstatt der Wert des
Befehlszeigers.

Du kannst Dir diesen Speicherbereich, wo der IP bei jedem call
gesichert wird, wie einen an der Decke hängenden Stapel vorstellen. Bei
jedem call oder push wird was unten drangepappt, bei jedem ret oder pop
was wieder abgenommen.
Deswegen heißt der Speicherbereich eben "Stack", also Stapel.


Sind jetzt alle Unklarheiten beseitigt?

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.