Stack, Stackpointer



  • Hallo,

    Kann mir bitte mal jemand die beiden Begriffe Stack und Stackpointer so einfach wie möglich erklären (Anwendung eines Stackpointers wäre super)

    Ich hab da morgen nämlcih einen Theorie Test und kapier das noch nicht so ganz.
    Wenns wem hilft: es geht um den 8051/8052

    THX 🙂



  • Also ein Stack ist ein Speicher, der nach dem LiFo Prinzip funktioniert, dass heisst Last in First out und bedeutet so viel, dass das letzte was auf den Stack kommt, dass erste ist, was wiederabgehoben wird

    Beispiel

    movl $5, %eax
    pushl %eax
    

    nun haben wir den Inhalt von %eax (5) auf den Stack gepusht. Nun pushen wir noch einen Wert

    movl $3, %eax
    pushl %eax
    

    also liegt jetzt folgendes auf dem Stack

    3
    5
    

    Wenn wir jetzt etwas abheben vom Stack, heben wir erst 3 ab, weil es das letzte war, was wir drauf gepusht haben

    popl %eax
    

    Der Stackpointer gibt einfach nur die Position des letzten Elements auf dem Stack an AFAIK



  • Danke das war schon einmal sehr brauchbar.
    Das Problem ist, dass wir bisher nur Theorie gemacht haben und morgen Test haben - ohne Praxis, wie soll sich denn da einer was merken 😕

    Jetzt liegt da noch so ein Beispiel vor mir, wo ein Haufen LCALL drinnen stehen, und immer bei einem LCALL wird der Stack-Pointer um eins erhöht, dann gehts irgendwann per RET wieder zurück und der Pointer wird decrementiert ?
    Könnte mir bitte noch jemand erklären, was da so passiert ?

    THX



  • Original erstellt von CrazyOwl:
    Jetzt liegt da noch so ein Beispiel vor mir, wo ein Haufen LCALL drinnen stehen, und immer bei einem LCALL wird der Stack-Pointer um eins erhöht, dann gehts irgendwann per RET wieder zurück und der Pointer wird decrementiert ?
    Könnte mir bitte noch jemand erklären, was da so passiert ?

    War das erste nun eine Frage oder eine Aussage?
    Bei Intel ist das naemlich genau andersrum: der Stack waechst nach unten. Soll heissen, dass der Stackpointer decrementiert wird, wenn was auf den Stack gestapelt wird und incrementiert, wenn wieder etwas runtergeholt wird...

    Wie dem auch sei: so ein call ist praktisch ein jump, nur dass die Addresse der Anweisung nach dem call auf den Stack (Stapel) gepackt wird.
    Wenn was auf den Stapel gepackt wird, wird dieser logischerweise vergroessert. Da der Stackpointer immer auf das Ende des Stacks zeigt, wird bei Intel also - je nach groesse des Objekts, dass gestapelt wurde - mindestens 2 (word ist kleinste stapelbare Einheit) vom Stackpointer abgezogen. (Weil: Stack bei Intel waechst nach unten)

    Wenn nun nach einem call ein ret ausgefuehrt wird, wird die Codeausfuehrung an der Addresse, die zu oberst auf dem Stapel liegt fortgesetzt. Diese Addresse wird dabei wieder vom Stapel entfernt => Stapel wird kleiner => Stackpointer muss (bei Intel) wieder erhoet werden, um wieder aufs Ende des Stapels zu zeigen.
    Wenn also ein call und gleich danach ein ret ausgefuehrt wird, wird der code hinter dem call weiter ausgefuehrt.



  • Ok, danke erstmal, werde mich sicher noch öfters melden in nächster Zeit 😉 🕶


Anmelden zum Antworten