Ret Befehl funktoniert nach Push Befehl nicht mehr

OP #617983
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.
#618037
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
#618056
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

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren