mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Ret Befehl funktoniert nach Push Befehl nicht mehr


Autor: Michael B. (gm8816)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,
nachdem ich ein Unterprogramm mit rcall aufgerufen habe und in diesem 
Unterprogramm Register sichern will funktioniert der Befehl ret nicht 
mehr. Das Programm springt immer wieder an die Adresse 0x0000 zurück. 
Ich benutze den ATtiny84. Der Stackpointer wurde bereits initialisiert 
und funktioniert auch. Ich habe es mit anderen Unterprogrammen versucht. 
Es passiert nur, wenn ich den Befehl push aufrufe.

Autor: Frank (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich hab zwar keine Ahnung von AVRs, aber das push wird den Stackpointer 
verändern. Dann passt die Rücksprungadresse nicht mehr, weil die ja auf 
dem stack liegt. Ein passendes pop zu jedem push vielleicht?

Autor: Uhu Uhuhu (uhu)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Das ist logischerweise so, denn ret nimmt den obersten Wert vom Stack 
als Rückkehradresse und zählt den Stackpointer um die Länge eines Wortes 
hoch.

Autor: Johannes M. (johnny-m)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo, das ist ein Doppelposting. Bitte weitere Antworten hier:
Beitrag "Ret Befehl funktioniert nach Push Befehl nicht mehr"

Autor: Marius Wensing (mw1987)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ist doch klar, dass das ganze nicht funktioniert...
Du sicherst also dein Register in dem vermutlich 0x0000 steht. Das kommt 
mit dem push-Befehl auf den Stack. Das heißt 0x0000 liegt jetzt oben auf 
dem Stack. Der ret-Befehl macht nun nichts anderes, als das oberste 
Element vom Stack herunterzunehmen und als Sprungadresse zu 
interpretieren. Da ja aber 0x0000 oben liegt, springt er auch da hin.
Bevor du also den ret-Befehl anwenden kannst, musst du alle Register, 
die du gesichert hast wieder zurücksichern mit dem pop-Befehl. Dann 
liegt wieder die korrekte Rücksprungadresse oben auf dem Stack.

MfG
Marius

Autor: Troll Blaubär (blaubeer)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Marius Wensing wrote:
> Ist doch klar, dass das ganze nicht funktioniert...
> Du sicherst also dein Register in dem vermutlich 0x0000 steht. Das kommt
> mit dem push-Befehl auf den Stack. Das heißt 0x0000 liegt jetzt oben auf
> dem Stack.

Nööö... Das muss nicht $0000 sein, jeder Wert oberhalb des benutzten 
Adressraums reich für diesen Fehler bereits aus.

> Der ret-Befehl macht nun nichts anderes, als das oberste
> Element vom Stack herunterzunehmen und als Sprungadresse zu
> interpretieren.

Nööö, er nimmt dazu die zwei oberen Elemente vom Stack.

> Da ja aber 0x0000 oben liegt, springt er auch da hin.

Oder erspringt hinter den vom Programm benutzten Adressbereich und 
hangelt sich bis zum ersten gültigen Befehl durch, der logischerweise 
bei $0000 liegt.

> Bevor du also den ret-Befehl anwenden kannst, musst du alle Register,
> die du gesichert hast wieder zurücksichern mit dem pop-Befehl. Dann
> liegt wieder die korrekte Rücksprungadresse oben auf dem Stack.

Das ist korrekt.

>
> MfG
> Marius

MfG, 5406

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.