Ich habe eine einfache Funktion in C geschrieben,
%Vor%Wenn ich es im Disassembler von gdb zerlege, gibt es folgende Demontage.
%Vor% Sehen Sie sich jetzt Zeile drei an, 0x08048467 <+3>: sub
, ich habe nur 8 Bytes als lokale Variable zugewiesen, dann wies der Compiler 16 Bytes (0x10) zu. xor %gs:0x14,%eax
x10,%esp
Zweitens, was bedeutet %code% .
@Edit: Wenn es Optimierung ist, gibt es eine Möglichkeit, es zu stoppen.
Danke.
Zwei Dinge:
In Bezug auf Ihre andere Frage, die Sie getrennt hätten stellen sollen, ist xor %gs:0x14,%eax
eindeutig Teil eines Stack-Schutz-Mechanismus , Standardmäßig aktiviert. Wenn Sie GCC verwenden, deaktivieren Sie es mit -fno-stack-protector
.
Neben den anderen bereits gegebenen Antworten wird gcc es vorziehen, den Stapel 16-Byte-ausgerichtet zu halten, um SSE-Werte auf dem Stapel zu speichern, da einige (alle?) der SSE-Befehle erfordern, dass ihr Speicherargument 16-Byte-ausgerichtet ist / p>
Dies baut auf Pascals Antwort auf, aber in diesem Fall liegt das wahrscheinlich am Stack-Schutz-Mechanismus.
Sie ordnen 8 Bytes zu, das ist ausreichend und wird mit dem Stack-Pointer berücksichtigt. Außerdem wird die aktuelle Stapelschutzadresse in %ebp
gespeichert, die in den folgenden Zeilen auf top des aktuellen Stapelrahmens zeigt
Dies scheint vier Bytes zu dauern. In Anbetracht dessen sind die anderen vier Bytes wahrscheinlich für die Ausrichtung irgendeiner Form oder werden mit anderen Stapelinformationen in den folgenden Zeilen aufgenommen:
%Vor%Tags und Links optimization c assembly compiler-construction gdb