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を読み書きします。