Ret und Call klappt nicht! Warum?

Gast #53890
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
Gast #53891
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?

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 22 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.