那么在x86-64上它是大端?

时间:2011-05-16 13:48:23

标签: x86-64 endianness

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

..

0x400507 <main+28>: 0x28bf0c74

我的结论是对的吗?

2 个答案:

答案 0 :(得分:61)

不,Intel CPU是小端:http://en.wikipedia.org/wiki/Endianness

答案 1 :(得分:18)

首先,您需要知道几乎所有现代CPU都可以操作的最小数据单元是一个8位的字节。对于数字,我们(人类)从左到右书写和读取,我们首先写出最重要的数字,所以最重要的数字在左边。

little-endian意味着CPU的两件事:

  1. 假设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
    
  2. 当CPU将整数值0x00183CFF写入内存时也是如此。它将0xFF置于最低地址,将0x00置于最高地址。如果您(人类)直观地从低地址到高地址读取字节,则读出FF 3C 18 00,这是写入0x00183CFF的相反顺序。

  3. 对于BIG-endianness,CPU在较低地址读取和写入MSB,在较高地址读取LSB。