PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : wiso Registerwerte im Stack ablegen



The Man
09.12.2006, 18:37
Hallo an alle,

ich lese gerade ein TUT zu Assambler. Dort wird beschrieben, wie ich einen Registerwert in den Stack schreibe. Ich versteh den Sinn dahinter nicht ganz, da sich der Stack doch im RAM befindet. Also warum solte ich Werte in den Stack statt in den RAM schreiben und mich so an das LIFO Prinzip binden?

Danke,
The Man

izaseba
09.12.2006, 19:31
Stack ist nur für eine kurze Zwischenspeicherung um z.B. Rücksprungadressen dort abzulegen,Registerinhalte oder SREG beim betreten einer ISR zu sichern usw.
Oder um ein Register eben auseinanderzunehmen, ohne seinen Inhalt zu verlieren, Beispiel:


push R16
andi R16,0xF0
out PORTB,R16
pop R16
andi R16,0x0F
out PORTB,R16

Sehr beliebt um im 4Bit Modus ein Display anzusteuern.

Gruß Sebastian

JonnyP
10.12.2006, 09:07
Brauchst du nicht, wenn du keine Unterprogramme oder Interrupts verwendest. An sonsten hat izaseba eigentlich schon alles gesagt. Vielleicht solltest du dich mal über Rücksprungadressen schlau machen.

SIGINT
10.12.2006, 10:12
Meiner Meinung nach ist der Stack ein extrem wichtiger Bestandteil einer Prozessorarchitektur und deshalb es Wert verstanden zu werden.
Im Bereich der x86 wird der Stack fast immer zur Parameterübergabe an Unterprogramme und Interrupthandler verwendet. Siehe folgenden Link:
http://de.wikipedia.org/wiki/Aufrufkonvention
Das kann man auch bei den AVRs machen... auch wenn sich die Register für Parameterübergabe anbieten.

Nun zur Frage, warum man die Register nicht im RAM speichert:
Der Stack ist selbsständig in der Lage die Werte an der richtigen Adresse zwischen zu speicher... einfaches Beispiel:
Du hast ein Unterprogramm, daß die Register in festgelegten Speicherstellen ablegt... was passiert, wenn das Unterprogramm sich selbst aufrufen möchte: Es überschreibt die alten Registerwerte mit den nun aktuellen Werten. Das ist ein Problem. Bei einem Mikrocontroller wird man allerdings selten rekursive Programmteile verwenden, da es sehr leicht zu einem Buffer-Overflow (hier:Stack) kommen kann. Allerdings kann es Probleme geben, wenn mehrere Interrupthandler den selben Zwischenspeicher verwenden würden. Interrupts können nämlich verschachtelt werden.

Gruß,
SIGINT

Felix G
10.12.2006, 11:52
Außerdem sollte man mit dem Stack umgehen können, wenn man C und Assembler kombinieren möchte.

also z.B. um eine in ASM geschriebene Funktion aus C aufzurufen oder umgekehrt, denn da werden die Argumente der Funktion über den Stack übergeben.