1. Diese Seite verwendet Cookies. Wenn du dich weiterhin auf dieser Seite aufhältst, akzeptierst du unseren Einsatz von Cookies. Weitere Informationen

Disassembliertes C-Programm

Dieses Thema im Forum "Sonstige Sprachen" wurde erstellt von Habana, 6. Juli 2017.

  1. Habana

    Habana Grünschnabel

    Ich habe hier ein C-Code Fragment welches zu beginn der Main Funktion diese Instruktionen ausführt.
    Code ((Unknown Language)):
    1.  
    2.                             push ebp
    3.                             mov ebp,esp
    4.                             and esp,0xfffffff0
    5.                             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?
     
  2. sheel

    sheel I love Asm Administrator

    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)
     
  3. Habana

    Habana Grünschnabel

    Super erklärt, vielen dank
     
Die Seite wird geladen...