web-dev-qa-db-ja.com

x86-64ではビッグエンディアンですか?

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

..

0x400507 <main+28>: 0x28bf0c74

私の結論は正しいですか?

32
kern

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

65
linuts

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

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

  1. CPUがメモリから4バイトをフェッチし、たとえば、アドレス0x00から開始し、そのアドレス0x0011111111であるバイト0xFFを保持するとします。 、アドレス0x0100111100であるバイト0x3Cを保持し、アドレス0x0200011000およびアドレス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
    
  2. CPUが整数値0x00183CFFをメモリに書き込むときも同じです。最下位アドレスに0xFFを配置し、最上位アドレスに0x00を配置します。 (人間が)下位アドレスから上位アドレスまで直感的にバイトを読み取る場合、FF 3C 18 00を読み取ります。これは、0x00183CFFが書き込まれるのと逆の順序です。

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

18
Gab是好人