Was ist die Argument-Push-Reihenfolge?

8

Ich lerne Assemblersprache. Was genau ist die Argument-Push-Reihenfolge? Ich verstehe, wie Argumente auf den Stack geschoben werden, aber was bedeutet der linke und der rechte Teil? links oder rechts von was? Oder hat dies nur mit der Art und Weise zu tun, wie der Befehl semantisch geschrieben wird, d.h.:

mov ebp, esp; esp wird in ebp von rechts nach links verschoben.

Stimmt das oder könnte mich jemand aufklären?

Vielen Dank!

    
Axolotl 04.02.2012, 14:31
quelle

2 Antworten

11

Der Prozessor kennt keine 'Funktionsargumente'. Wenn Sie also f(a,b,c) schreiben wollen, müssen Sie die Argumente wirklich irgendwo hinschieben.

Das ist Konvention. Ich weiß, dass auf den meisten x86-Maschinen Funktionsargumente auf dem Stapel von rechts nach links geschoben werden, d. H zuerst c, dann b, dann a.

%Vor%

Nun kann die aufgerufene Funktion ebx -1 für eine, ebx - 2 für b und ebx - 3 für c verwenden.

Sie könnten auch eine Konvention erstellen, die besagt: Die ersten beiden Argumente befinden sich in den Registern ebx und ecx , rest sind auf dem Stack. Solange der Anrufer und der Angerufene zustimmen, geht es Ihnen gut.

    
xtofl 04.02.2012 14:37
quelle
7

Zusätzlich zu xtofl können Sie sich die Tabelle von x86 Aufrufkonventionen . Was Sie im Hinblick auf die Reihenfolge der Argumente beachten werden, ist, dass fast alle der Argumente von rechts nach links geschoben werden (das Argument ganz rechts wird zuerst gedrückt) mit Ausnahme von Pascal.

Ein anderes Szenario, das xtofl nicht behandelt, sind Registerargumente - einige ABIs erfordern, dass einige Argumente in Registern im Gegensatz zu auf dem Stapel sind. Auf einem x86_64 -System zum Beispiel die Funktion:

%Vor%

wird Argumente setzen:

%Vor%

Konkret würde dies aussehen (Intel-Syntax):

%Vor%

Also werden die Register aus der Registerliste von links nach rechts gefüllt und dann wird der Stack rechts nach links verwendet.

Wie xtofl sagt, ist es egal, was Sie tun, vorausgesetzt, der Anrufer und der Angerufene stimmen zu - wenn der Anrufer und der Angerufene nicht zustimmen , führt dies jedoch zu Inkompatibilitätsproblemen, und dies ist eigentlich ein Problem nicht nur für Assembler, sondern auch für höhere Sprachen - glücklicherweise operieren Compiler weitgehend von rechts nach links. Für weitere Informationen können Sie die Aufräumfunktion des Aufrufers / Aufrufers interessant finden - und beachten Sie, wie diese auf eine Methode für x86_64 standardisiert wurde.

Sie sagen nicht, dass Sie x86 verwenden - Ihre Architektur wird sicherlich eine Standard-Aufrufkonvention haben, da das Arbeiten ohne sie schwierig ist.

    
user257111 04.02.2012 14:51
quelle

Tags und Links