Forum: Mikrocontroller und Digitale Elektronik Stack is Weg


von gye (Gast)


Lesenswert?

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

von Walter S. (avatar)


Lesenswert?

gye schrieb:
> hoffentlich versteht jemand was hier steht :D

nein ...

wo steht der PC wenn du den Stackpointer anschaust,
wie sieht die funktion aus?
Schau dir am besten den Assemblerfile an, dann siehtst du vielleicht 
klarer

von Falk B. (falk)


Lesenswert?

@ 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;

von gye (Gast)


Lesenswert?

->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.

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.