mikrocontroller.net

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


Autor: noname (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Johannes Raschke (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.