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


von Michael B. (gm8816)


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.

von Frank (Gast)


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?

von Uhu U. (uhu)


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.

von Johannes M. (johnny-m)


Lesenswert?

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

von Marius W. (mw1987)


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

von Troll B. (blaubeer)


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

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.