Так на x86-64 это big endian? - PullRequest
32 голосов
/ 16 мая 2011
0x0000000000400507 <main+28>:    74 0c  je     0x400515 <main+42>
0x0000000000400509 <main+30>:    bf 28 06 40 00 mov    $0x400628,%edi

..

0x400507 <main+28>: 0x28bf0c74

Правильно ли мое заключение?

Ответы [ 2 ]

64 голосов
/ 16 мая 2011

Нет, процессоры Intel с прямым порядком байтов: http://en.wikipedia.org/wiki/Endianness

18 голосов
/ 29 декабря 2016

Во-первых, вы должны знать, что наименьшая единица данных, которой могут манипулировать почти все современные процессоры, - это 8-битный байт. Для чисел мы (люди) пишем и читаем слева направо, и сначала мы пишем самую значимую цифру, поэтому самая значимая цифра находится слева.

little-endian подразумевает две вещи для процессора:

  1. Предположим, что ЦП извлекает из памяти 4 байтов, например, начиная с адреса 0x00, и этот адрес 0x00 содержит байт 11111111, равный 0xFF, адрес 0x01 содержит байт 00111100, равный 0x3C, адрес 0x02 содержит байт 00011000, равный 0x18, а адрес 0x03 содержит байт 00000000, равный 0x00, тогда, когда процессор интерпретирует эти 4 байта как целое число, они будут интерпретироваться как целочисленное значение 0x00183CFF. То есть ЦП будет считать байт с самым высоким адресом самым старшим байтом (MSB), то есть для ЦП, чем выше адрес, тем значительнее будет байт на этом адресе.

     (0xFF)   (0x3C)   (0x18)   (0x00)    <-----value of each byte in hex
    11111111 00111100 00011000 00000000   <-----byte at each addresse
    ^        ^        ^        ^
    0x00     0x01     0x02     0x03       <-----addresses
    
  2. То же самое, когда ЦП записывает целое значение 0x00183CFF в память. Это поместит 0xFF в самый низкий адрес и 0x00 в самый высокий адрес. И если вы (человек) интуитивно читаете байты с низких адресов на высокие, вы читаете FF 3C 18 00, что является обратным порядком записи 0x00183CFF.

Для BIG-endianness ЦП читает и записывает MSB по более низким адресам и LSB по более высоким адресам.

...