Es gibt viele Ressourcen gibt, die dies erklären:
nur einige zu nennen.
Grundsätzlich, wie Sie etwas beschrieben, „der Stapel“ dient mehreren Zwecken in der Ausführung eines Programms:
- Die Verfolgung von wo man zurück, wenn Aufruf einer Funktion
- Speicherung von lokalen Variablen im Kontext eines Funktionsaufrufs
- Übergabe von Argumenten von aufrufende Funktion zu callee.
Die Prolouge ist, was am Anfang einer Funktion passiert. Seine Aufgabe ist es, den Stack-Frame der aufgerufenen Funktion einzurichten. Der Epilog ist das genaue Gegenteil: Es ist das, was zuletzt in einer Funktion passiert, und sein Zweck besteht darin, den Stapelrahmen der aufrufenden (übergeordneten) Funktion wiederherzustellen.
In IA-32 (x86) cdecl wird das ebp
Register von der Sprache verwendet, um den Stapelrahmen der Funktion zu verfolgen. Das esp
Register wird vom Prozessor verwendet, um auf den letzten Zusatz (den obersten Wert) auf dem Stapel zu zeigen.
Die call
Anweisung macht zwei Dinge: Erstens drückt er die Rücksprungadresse auf den Stapel, dann springt er auf die Funktion aufgerufen wird. Unmittelbar nach der call
zeigt esp
auf die Rücksprungadresse auf dem Stapel.
Dann wird der Prolog ausgeführt:
push ebp ; Save the stack-frame base pointer (of the calling function).
mov ebp, esp ; Set the stack-frame base pointer to be the current
; location on the stack.
sub esp, N ; Grow the stack by N bytes to reserve space for local variables
An diesem Punkt haben wir:
...
ebp + 4: Return address
ebp + 0: Calling function's old ebp value
ebp - 4: (local variables)
...
Der Epilog:
mov esp, ebp ; Put the stack pointer back where it was when this function
; was called.
pop ebp ; Restore the calling function's stack frame.
ret ; Return to the calling function.
Sie könnten nach Material über Compiler und Codegenerierung suchen. –