2014-06-17 19 views
6

ich am dissasembly einen Funktionsaufruf war auf der Suche und fand diese:Warum den Stack bei einem Funktionsaufruf auffüllen?

movq %rsp, %rbp 
pushq %rbx 
subq $136, %rsp  ; Pad the stack 
.... 
addq $136, %rsp  ; Unpad the stack 
popq %rbx 
popq %rbp 
ret 

Was ist der Wert, dies zu tun ist?

+1

Schnellerer Zugriff auf entsprechende Speicheradressgrenzen (wie bei jeder Auffüllung). –

+0

Oh, wie beim Zugriff auf Speicher durch Offset ist schneller als der Zugriff durch Drücken von 'Push'es? – sircodesalot

+3

Ich nehme an, sie reservieren Platz für lokale Variablen mit Funktionsumfang. Danach müssen Sie den Stapelzeiger an der richtigen Stelle platzieren, um den Stapelrahmen nicht zu stören (um an die richtige Stelle im Programm zurückzukehren). –

Antwort

12

Das ist der Platz für lokale Variablen, nicht padding.

Der Compiler erstellt diesen Stapelspeicher für alle Registerüberläufe und lokalen Variablen, die er beim Ausführen dieser Funktion speichern muss.

Sie könnten einige Auffüllen, wenn Sie x86-64 Code mit dem SysV ABI (die meisten Dinge, die nicht Windows, ich weiß nicht, wie es in letzterem ist) zu disassemblieren, da Funktionsaufrufe den Stapel haben müssen auf 16 Bytes ausgerichtet. Aber in diesem Fall reserviert es tatsächlich Platz für lokale Variablen.

Sie können sich die Datei this ansehen oder nach weiteren Informationen zur Funktionsweise von Compilern suchen.

Verwandte Themen