2010-11-29 12 views
6

Alolokale Variablen schieben

Nachdem ich über Funktion gelesen haben und Stapel von http://en.wikibooks.org/wiki/X86_Disassembly/Functions_and_Stack_Frames habe ich eine Frage über lokale Variablen.

Snapshot aus dem Artikel:


push ebp  ; save the value of ebp 
mov ebp, esp ; ebp now points to the top of the stack 
sub esp, 12 ; space allocated on the stack for the local variables 

Dies bedeutet, lokale Variablen durch Bezugnahme auf EBP zugegriffen werden kann. Betrachten Sie das folgende C-Code-Fragment und entsprechenden Assembler-Code:

a = 10; 
b = 5; 
c = 2; 

mov [ebp - 4], 10 ; location of variable a 
mov [ebp - 8], 5 ; location of b 
mov [ebp - 12], 2 ; location of c 

Denken Sie daran, dass im Grunde tut drückt dies:

sub esp, 4 ; "allocate" space for the new stack item 
mov [esp], X ; put new stack item value X in 


Warum sind lokale Variablen nicht drücken in den Stapel wie folgt aus:

push 10 
push 5 
push 2 

statt

sub esp, 12 

mov [ebp - 4], 10 ; location of variable a 
mov [ebp - 8], 5 ; location of b 
mov [ebp - 12], 2 ; location of c 
+0

Sie können auf Boath Wege tun, aber seien Sie vorsichtig mit der Reihenfolge! –

+0

Ist sub esp, 4 - mov [esp], 10 nicht gleich mov [ebp-4], 10? – chitech

Antwort

1

Es ist eher eine Frage der Semantik als der technischen Korrektheit: push und pop werden verwendet, um Register oder Werte zu speichern und wiederherzustellen; aber Bereitstellung lokale Variablen für eine Funktion entspricht nicht diesem regelmäßigen Zweck push/pop. Also, der Stapel wird hier manuell verwaltet (außer push ebp und pop ebp, denn hier wollen wir eigentlich ebp im wahren Sinne von push/pop speichern und wiederherstellen).

+0

Thx für die Erklärung. Der Snapshot bezieht sich auf lokale Variablen in einer Funktion und nicht auf Parameter für eine Funktion. In dem Artikel verwenden sie Push für Parameter zu einer Funktion, so dass mich verwirren, warum lokale Variablen ist nicht Push-Parameter in der Funktion – chitech

+0

Ups, ich verwirrt. Ich meinte lokale Variablen. Es tut uns leid. Ich habe den Beitrag jetzt bearbeitet. – Flinsch

1

Praktisch, wenn Sie wissen, wie viel Stapelplatz Sie benötigen und es in einer einzigen Operation reservieren, können Sie die mov-Anweisung verwenden, die schneller als ein Push ausgeführt wird (besonders jetzt, wenn die Offset-Berechnung dedizierte Hardware hat). Es gibt vielleicht auch eine ältere Komponente, die mit der Tatsache zu tun hat, dass Push-Immed auf dem x86 erst zur Veröffentlichung der 80186/80188-Prozessoren verfügbar wurde. Zu dieser Zeit war die sub/mov-Konvention zu einem gut etablierten Muster geworden.

+0

Ich verstehe. Ich glaube nicht, dass das Legacy-Problem mit Push ein Problem für mich ist. Aber ich sehe, dass die Leistung durch Push Wirkung haben kann. Der Push benutzt einen [sub esp, 4] extra Befehl für jede lokale Variable – chitech