0x0000000000400507 <main+28>: 74 0c je 0x400515 <main+42>
0x0000000000400509 <main+30>: bf 28 06 40 00 mov $0x400628,%edi
..
0x400507 <main+28>: 0x28bf0c74
Ist meine Schlussfolgerung richtig?
Nein, Intel-CPUs sind Little Endian: http://en.wikipedia.org/wiki/Endianness
Zunächst müssen Sie wissen, dass die kleinste Dateneinheit, die von fast allen modernen CPUs manipuliert werden kann, ein Byte mit 8 Bit ist. Bei Zahlen schreiben und lesen wir (Menschen) von links nach rechts und schreiben die höchstwertige Ziffer zuerst, sodass die höchstwertige Ziffer links steht.
little-Endian impliziert zwei Dinge für die CPU:
Angenommen, die CPU holt 4
Bytes aus dem Speicher, z. B. beginnend mit der Adresse 0x00
und diese Adresse 0x00
enthält das Byte 11111111
welches ist 0xFF
, Adresse 0x01
enthält das Byte 00111100
welches ist 0x3C
, Adresse 0x02
enthält das Byte 00011000
welches ist 0x18
und Adresse 0x03
enthält das Byte 00000000
welches ist 0x00
, wenn die CPU diese 4 Bytes als Ganzzahl interpretiert, interpretiert sie sie als Ganzzahlwert 0x00183CFF
. Das heißt, die CPU betrachtet das Byte an der höchsten Adresse als das höchstwertige Byte (Most Significant Byte, MSB). Dies bedeutet, dass für die CPU das Byte an dieser Adresse umso wichtiger ist, je höher die Adresse ist.
(0xFF) (0x3C) (0x18) (0x00) <-----value of each byte in hex
11111111 00111100 00011000 00000000 <-----byte at each addresse
^ ^ ^ ^
0x00 0x01 0x02 0x03 <-----addresses
Gleiches gilt, wenn die CPU den Integer-Wert 0x00183CFF in den Speicher schreibt. Es wird 0xFF an die niedrigste Adresse und 0x00 an die höchste Adresse gesetzt. Und wenn Sie (Menschen) Bytes intuitiv von niedrigen Adressen zu hohen Adressen lesen, lesen Sie FF 3C 18 00 aus. Dies ist die umgekehrte Reihenfolge, in der 0x00183CFF geschrieben wird.
Für BIG-Endianness liest und schreibt die CPU MSBs an niedrigeren Adressen und LSBs an höheren Adressen.