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.
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?
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.
Hallo, das ist ein Doppelposting. Bitte weitere Antworten hier: Beitrag "Ret Befehl funktioniert nach Push Befehl nicht mehr"
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
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.