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