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

不,英特尔 CPU 是小端:http ://en.wikipedia.org/wiki/Endianness

于 2011-05-16T13:49:59.517 回答
32

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

Little-endian 字节顺序对 CPU 意味着两件事:

  1. 假设 CPU 从内存中取出 4 个字节,例如从 address 开始0x00,并且:

    • address0x00保存字节11111111,即0xFF;
    • address0x01保存字节00111100,即0x3C;
    • address0x02保存字节00011000,即0x18;
    • address0x03保存字节00000000,即0x00.

    然后,当 CPU 将这 4 个字节解释为整数时,它会将它们解释为整数值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-endianness,CPU 读取和写入低地址的 MSB 和高地址的 LSB。

于 2016-12-29T13:12:50.337 回答