0x0000000000400507 <main+28>: 74 0c je 0x400515 <main+42>
0x0000000000400509 <main+30>: bf 28 06 40 00 mov $0x400628,%edi
..
0x400507 <main+28>: 0x28bf0c74
Правильно ли я прав?
0x0000000000400507 <main+28>: 74 0c je 0x400515 <main+42>
0x0000000000400509 <main+30>: bf 28 06 40 00 mov $0x400628,%edi
..
0x400507 <main+28>: 0x28bf0c74
Правильно ли я прав?
Нет, процессоры Intel мало ориентированы: http://en.wikipedia.org/wiki/Endianness
Во-первых, вам нужно знать, что самый маленький блок данных, который могут обрабатывать почти все современные процессоры, - это бит, который составляет 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 на более низких адресах и младших разрядах на более высоких адресах.