Disassembliertes C-Programm


Habana

Grünschnabel
Ich habe hier ein C-Code Fragment welches zu beginn der Main Funktion diese Instruktionen ausführt.
Code:
                            push ebp
                            mov ebp,esp
                            and esp,0xfffffff0
                            sub esp,0x60


Also als erstes wird der alte Base Pointer auf den Stack gepusht.
Anschließend der Base Pointer und der Stack Pointer auf die selbe Adresse gesetzt
und am schluss 0x60 Byte für die lokalen Variablen eingerichtet.

Meine Frage ist nun wieso werden die letzten 4 Bit durch die Ver-und-ung
auf NULL gesetzt?
 

sheel

I love Asm
Hi

mathematisch ist das "so viel subtrahieren, dass das Ergebnis ein Vielfaches von 16 ist".
...
Es gibt bei verschiedenen Prozessorbefehlen (verschiedener Prozessoren) "Alignment"-Anforderungen. Wenn man zB. 4-Byte-Zahlen hat, und die mit Befehlen für 4-Byte-Daten bearbeitet (addieren oder was auch immer), ist ein Datending aligned, wenn die Startadresse ein Vielfaches von 4 ist. Byte 100,101,102,103 wäre ok, 102,103,104,105 aber nicht. ... Wenn es um 8-byteige Daten und dafür geeignete Befehle geht muss es ein Vielfaches von 8 sein. usw.

Mit nicht alignten Daten zu arbeiten ist teilweise langsamer, teilweise gar nicht möglich (je nach Befehl usw.). Der Compiler ordnet die Daten daher möglichst immer entsprechend an, dass die ein für ihre Verwendung passendes Alignment haben.

Da es hier dann nicht um absolute Adressen geht, sondern relative Sachen zum Stackpointer, wäre es nett wenn der auch aligned wäre, damit man seine Verschiebung nicht bei jeder Stackvariable beachten muss (zumindest einfacher für die Compilerschreiber). Daher ... einfach zu den 0x60 Byte noch genug dazu, damit ein Vielfaches rauskommt. 16 deswegen, weil es auf der betroffenen Prozessorarchitektur wohl keine 32-Byte-Befehle gibt, und 16 damit das maximal nötige Alignment ist (und ein Vielfaches von 16 natürlich auch ein Vielfaches von 8, 4 und 2 ist, und damit für alles passt)