2013-02-08 9 views
6

Ich weiß, dass Daten in geschachtelten Funktionsaufrufen an den Stack gehen. Der Stack selbst implementiert eine Schritt-für-Schritt-Methode zum Speichern und Abrufen von Daten aus dem Stapel beim Aufruf oder Rückgabe der Funktionen von diesen Methoden ist am meisten als Prolog und Epilog bekannt.Funktion Prolog und Epilog in C

Ich versuchte mit keinem Erfolg, Material zu diesem Thema zu suchen. Kennst du irgendeine Ressource (Website, Video, Artikel) darüber, wie Funktion Prolog und Epilog allgemein in C funktioniert? Oder wenn Sie erklären können, wäre es noch besser.

P.S: Ich möchte nur eine allgemeine Ansicht, nicht zu detailliert.

+0

Sie könnten nach Material über Compiler und Codegenerierung suchen. –

Antwort

13

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:

  1. Die Verfolgung von wo man zurück, wenn Aufruf einer Funktion
  2. Speicherung von lokalen Variablen im Kontext eines Funktionsaufrufs
  3. Ü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. 
-1

Jede Funktion hat einen identischen Prolog (den Beginn des Funktionscode) und Epilog (das Ende einer Funktion).

Prolog: Die Struktur des Prologs ist wie folgt aussehen: Push EBP mov esp, EBP

Epilog: Die Struktur des Prologs ist wie folgt aussehen: verlassen ret

Mehr im Detail: what is Prologue and Epilogue

+0

hängt von der Aufrufkonvention ab –