Подтвердить что ты не робот

Итак, на x86-64 это большой эндиан?

0x0000000000400507 <main+28>:    74 0c  je     0x400515 <main+42>
0x0000000000400509 <main+30>:    bf 28 06 40 00 mov    $0x400628,%edi

..

0x400507 <main+28>: 0x28bf0c74

Правильно ли я прав?

4b9b3361

Ответ 2

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

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

  • Предположим, что ЦПУ извлекает 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
    
  • То же самое, когда CPU записывает целочисленное значение 0x00183CFF в память. Он поместит 0xFF на самый низкий адрес и 0x00 на самый высокий адрес. И если вы (человек) читаете байты интуитивно с низких адресов на высокие адреса, вы читаете FF 3C 18 00, который является обратным порядком, в котором он написан.

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