Frage

Ich möchte wissen, wer für die Bereinigung des Stapels verantwortlich ist

Angenommen, Sie haben eine unterhaltsame Funktion, sagen wir so:

var = fun(int x, int y, float z, char x);

Wann fun Wird aufgerufen, geht es zusammen mit den Parametern in den Stapel. Wenn die Funktion zurückkehrt, ist die Person, die für die Bereinigung des Stapels verantwortlich ist, die Funktion selbst oder die „Var“, die den Rückgabewert enthält.

Noch eine Sache: Kann jemand die Konzepte zum Aufrufen von Konventionen erklären?

War es hilfreich?

Lösung

Konvention Aufruf bezieht sich auf die die Bereinigung des Stapels tut; Anrufer oder Angerufenen.

  

Konventionen aufrufen können unterscheiden sich in:

     
      
  • , wo Parameter und Rückgabewerte gesetzt werden (in den Registern, auf den Anruf   Stapel; eine Mischung aus beidem)
  •   
  • die Reihenfolge, in der Parameter übergeben werden (oder Teile eines einzigen   Parameter)
  •   
  • , wie die Aufgabe der Einrichtung und einen Funktionsaufruf Reinigung wird geteilt   zwischen dem Anrufer und dem Angerufenen.
  •   
  • die Register, die direkt durch den Angerufenen verwendet werden kann, kann manchmal auch   einbezogen werden
  •   
     

Architekturen haben fast immer mehr   als eine mögliche Aufrufkonvention.

Andere Tipps

Sie haben selbst auf die Antwort verwiesen: Aufrufkonventionen.

Eine Aufrufkonvention ähnelt einer Vertrag.Es entscheidet über folgende Dinge:

  • Wer ist für die Bereinigung der Parameter verantwortlich?
  • Wie und in welcher Reihenfolge die Parameter an die aufgerufene Funktion übergeben werden.
  • Wo der Rückgabewert gespeichert wird.

Abhängig von der Plattform und der Programmierumgebung gibt es viele verschiedene Aufrufkonventionen.Zwei gängige Aufrufkonventionen auf den x86-Plattformen sind:

stdcall

Die Parameter werden von rechts nach links an den Stapel übergeben.Der angerufen Funktion bereinigt den Stapel.

cdecl

Die Parameter werden von rechts nach links an den Stapel übergeben.Der Berufung Funktion bereinigt den Stapel.

In beiden Fällen liegt der Rückgabewert im EAX registrieren (bzw ST0 für Gleitkommawerte)

Viele Programmiersprachen für die x86-Plattform ermöglichen die Angabe der Aufrufkonvention, zum Beispiel:

Delphi

function MyFunc(x: Integer): Integer; stdcall;

Microsoft C/C++

int __stdcall myFunc(int x)

Einige Nutzungshinweise:

Beim Erstellen einer einfachen Anwendung ist es selten erforderlich, die Aufrufkonvention zu ändern oder zu kennen. Es gibt jedoch zwei typische Fälle, in denen Sie sich mit Aufrufkonventionen befassen müssen:

  • Beim Aufruf externer Bibliotheken, Win32-API zum Beispiel:Sie müssen kompatible Aufrufkonventionen verwenden, sonst kann der Stack beschädigt werden.
  • Beim Erstellen von Inline-Assembler-Code:Sie müssen wissen, in welchen Registern und wo auf dem Stapel sich die Variablen befinden.

Für weitere Details empfehle ich diese Wikipedia-Artikel:

Mit der Zeit, dass Zeile abgeschlossen ist var den Wert von fun () und jede Erinnerung an den durch Spaß verwendet Stapel zurückhalten wird verschwunden sein. „Push“, „Pop“ alle ordentlich

Aufrufkonventionen: Alles, was der Compiler so dass Spaß organisiert kann seine Arbeit tun. Betrachten wir diejenigen Parameter x, y, z. Welche Reihenfolge bleiben sie auf den Stapel geschoben (in der Tat bleiben sie über den Stack übergeben)? Nicht so lange egal, wie der Anrufer und Angerufener zustimmen! Es ist eine Konvention.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top