Little-Endian



  • Moin,

    ich hab mal ne Frage zur Little-Endian Bytereihenfolge. Soweit ich das richtig verstanden habe, werden grundsätzlich ganzzahlige Werte in umgekehrter Reihenfolge in den Speicher abgelegt (also niederwertigstes Byte an die Anfangsadresse). Durchs experimentierne im Debugger, habe ich festgestellt, dass Instruktionen und Zeichenketten nicht umgedreht in den Speicher gelegt werden (wäre ja auch sinnlos). Jedoch bei folgender Zeile:

    0x8048393:       c7 04 24 84 84 04 08       mov DWORD PTR [esp], 0x8048484
    

    Warum wird hier die Adresse im Little-Endian Format abgelegt? Mir ist durchaus bewusst, dass eine Adresse im Prinzip nichts anderes als eine ganzzahlige Zahl ist, mit der auch gerechnet werden kann (Pointerarithmetik). Ist das aber in diesem Fall nicht umständlicher, die Adresse soherum im Register abzulegen? Oder wird das erste Byte der Adresse (vom Beispiel) automatisch an die letzte Stelle im Register verschoben?



  • 0x8048484 ist in Deinem Beispiel keine Adresse, sondern eine Zahl, die an der Adresse gespeichert wird, auf die ESP zeigt. Ob diese Zahl als Adresse interpretiert wird, wird sich erst später zeigen.

    Was genau innerhalb der CPU passiert, gehört zum Betriebsgeheimnis des Herstellers. Man kann nur sagen, wenn die CPU c7 04 24 ausgewertet hat, weiß sie, dass jetzt 4 Bytes folgen, die eine Zahl bilden. Wierum die ausgewertet werden, ist - elektrisch gesehen - Jacke wie Hose. Es ist halt mal so von INTEL festgelegt worden. Für kleinere Prozessoren, die wg. Datenbus Daten in mehreren Schritten speichern müssen (z.B. INTELs 8088), ist es u.U. besser, wenn die Daten im Maschinenbefehl in derselben Reihenfolge vorkommen, wie sie auch gespeichert werden. Dann können sie schon einmal zu schreiben beginnen, bevor die gesamte Zahl eingelesen worden ist.

    viele grüße
    ralph



  • Danke dir für deine Erklärung. 🙂


Log in to reply