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

..

0x400507 <main+28>: 0x28bf0c74

マシンコードがビッグエンディアンであることを示していると思います。私の結論は正しいですか?

4

2 に答える 2

89

いいえ、Intel CPUはリトルエンディアンです:http://en.wikipedia.org/wiki/Endianness

于 2011-05-16T13:49:59.517 に答える
32

まず、最近のほとんどすべてのCPUが操作できる最小のデータ単位は1バイト、つまり8ビットであることを知っておく必要があります。数字の場合、私たち(人間)は左から右に読み書きし、最上位桁を最初に書き込むので、最上位桁は左側にあります。

リトルエンディアンのバイト順序は、CPUにとって2つのことを意味します。

  1. 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
  1. CPUがメモリのように整数値を書き込む場合にも同じことが当てはまり0x00183CFFます。0xFF最小のアドレスと0x00最大のアドレスに配置されます。あなた(人間)がバイトを低いアドレスから高いアドレスに直感的に読み取る場合、FF 3C 18 00バイトごとに書き込まれる方法とは逆の順序でバイトを読み取ります0x00183CFF

BIGエンディアンの場合、CPUは下位アドレスでMSBを読み取り、上位アドレスでLSBを読み書きします。

于 2016-12-29T13:12:50.337 に答える