Stack is Weg

Gast #4443880
Hallo zusamme,

mir fehlt eine kleine Information um den Stack im ATMEGA16 zu verstehen. 
Vielleicht kann einer weiterhelfen.


RAM Adress | Bezeichner          | Wert
---------------------------------------
0x005D     | Stackpointer HB     |0x01
0x005E     | ""           LB     |0x30
-----------------------------------------
0x0130     |   ????              |


Worauf zeigt der Stackpointer? Dachte er zeigt auf die Rücksprungadresse 
und ist dann 2 Byte groß. Wenn ich im Debugger den Speicher mit dem 
Disassambly vergleiche stimmt der Wert auf den der Stackpointer zeigt 
nicht mit der Rücksprungadresse im RAM überein.



Bsp.


ProgrammCounter         Code

0x05                    Funktion();
0x06                    a=b;

RAM Adress | Bezeichner          | Wert
---------------------------------------
0x005D     | Stackpointer HB     |0x01
0x005E     | ""           LB     |0x30
-----------------------------------------
0x0130     |Rücksprungadresse    | hier sollte doch die Adresse (0x06) 
stehen die auf die nächste Zeile nach der Funktion() zeigt.

hoffentlich versteht jemand was hier steht :D
#4443904
@ gye (Gast)

>RAM Adress | Bezeichner          | Wert
>---------------------------------------
>0x005D     | Stackpointer HB     |0x01
>0x005E     | ""           LB     |0x30
>-----------------------------------------
>0x0130     |   ????              |


>Worauf zeigt der Stackpointer?

Auf die nächste freie RAM-Zelle.

>Dachte er zeigt auf die Rücksprungadresse

Nö, er ist schon eins weiter.

>und ist dann 2 Byte groß. Wenn ich im Debugger den Speicher mit dem
>Disassambly vergleiche stimmt der Wert auf den der Stackpointer zeigt
>nicht mit der Rücksprungadresse im RAM überein.

Beim call wird der PC erst auf dem stack gespeichert und DANACH dieser 
vermindert! In C nennt man das Postdekrement.

*stack-- = pc;   // Kurzform

Bei push ist es ebenso.

Beim return wird ZUERST der Stackpointer erhöht und danach der PC 
geladen.

pc = *++stack;
Gast #4444906
->Nö, er ist schon eins weiter.


Kein Wunder, dass ich die Adresse nicht finden konnte. :D


Hinzu kommt, dass in der Disassembly die Adresse als Word steht.

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 10 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.