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 CPUはリトルエンディアンです: http://en.wikipedia.org/wiki/Endianness
まず、ほとんどすべての最新のCPUが操作できる最小のデータ単位は8ビットのバイトであることを知っておく必要があります。数字の場合、私たち(人間)は左から右に読み書きし、最上位の桁を最初に書き込むので、最上位の桁は左側にあります。
リトルエンディアンは、CPUに対して2つのことを意味します。
CPUがメモリから4
バイトをフェッチし、たとえば、アドレス0x00
から開始し、そのアドレス0x00
が11111111
であるバイト0xFF
を保持するとします。 、アドレス0x01
は00111100
であるバイト0x3C
を保持し、アドレス0x02
は00011000
およびアドレス0x18
であるバイト0x03
を保持します00000000
であるバイト0x00
を保持し、CPUがこれらの4バイトを整数として解釈すると、整数値0x00183CFF
として解釈します。つまり、CPUは最上位アドレスのバイトを最上位バイト(MSB)と見なします。つまり、CPUにとっては、アドレスが高いほど、そのアドレスのバイトはより重要になります。
(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を読み取ります。これは、0x00183CFFが書き込まれるのと逆の順序です。
BIGエンディアンの場合、CPUは下位アドレスのMSBと上位アドレスのLSBを読み書きします。