Speicherung eines Byte-Array(X86, Windows, Little-Endian)



  • Hallo,
    ich bin ein bisschen verwirrt. Es geht um das Speichern von einem Byte-Array. Plattform ist x86 Windows im Little-Endian Format.
    Wenn ich den u.g. Code ausführe, bekomme ich folgendes raus:
    eax=0x40302010
    myarray=0x10

    Ich würde gerne wissen, wie das Ergebnis zustande kommt.
    Wenn myarray auf die Speicherstelle mit dem Wert 0x10 zeigt, dann müsste doch eax=0x10203040 sein.
    Letztendlich wird das Array doch so gespeichert:

    1 0x10 =myarray
    2 0x20
    3 0x30
    4 0x40
    5 0x50

    Oder?

    .386
    .model flat,stdcall
    .stack 4096
    ExitProcess proto,dwExitCode:dword
    .data
    	myarray byte 10h,20h,30h,40h,50h
    .code
    main proc
    
    	mov esi, offset myarray
    	mov eax, [esi]
    
    	invoke ExitProcess,0
    main endp
    end main
    


  • Genau das Prinzip nennt man "Little Endian". Was du erwartet hast, würde man auf einer "Big Endian"-Maschine sehen.



  • Auf deiner Maschine werden Daten byteweise hintereinander gespeichert. Bei der Anweisung "myarray byte 10h,20h,30h,40h,50h" ist das kein Problem. Im Speicher stehen dann die Bytes hintereinander: 10h, 20h, 30h, 40h, 50h.

    Problematisch wird es, wenn ein Wert in mehrere Bytes aufgeteilt werden muss. Zunächst musst Du Dir vergegenwärtigen, dass im wirklichen Leben die höchstwertige Ziffer üblicherweise links steht, z.B. stehen bei der Dezimalzahl 123 links der Hunderter, in der Mitte die Zehner und rechts die Einer. Das ist aber nicht immer so. Sprich mal die Zahl aus: "Einhundertdreiundzwanzig" - zuerst der Hunderter, dann die Einer, dann die Zehner. Bei einer Uhrzeit wie "fünf nach zwölf" kommt zuerst der niederwertige Wert (Minuten) und dann der höherwertige (Stunden). Wenn das höherwertige "dicke" Ende zuerst kommt, dann spricht man von "big endian (first)", im anderen Fall von "little endian (first)".

    Bei x86-Prozessoren hat man sich für "little endian" entschieden. Eine Zahl wie 0x10203040 (big endian geschrieben) wird in 4 Bytes aufgeteilt und landet im Speicher als 40h, 30h, 20h, 10h (little endian). Gelesen wird genauso. Die Speicherwerte 40h, 30h, 20h, 10h werden also zu 0x10203040 zusammengesetzt, und deine vorher hintereinander gespeicherten Werte 10h, 20h, 30h, 40h werden zu 0x40302010 zusammengesetzt. Übrigens: auch die Big-Endian-Schreibweise des Ergebnisses ist rein willkürlich.

    Zusammengefasst: Du hast den Computer angewiesen, mehrere Bytes hintereinander in den Speicher zu schreiben, sie als 4-Bytes-Little-Endian-Wert wieder auszulesen und dir als 4-Bytes-Big-Endian-Wert anzuzeigen. Das Ergebnis sieht genauso aus, wie Du es beschrieben hast.

    viele grüße
    ralph



  • OK. Vielen Dank!!


Log in to reply