0x0000000000400507 <main+28>: 74 0c je 0x400515 <main+42>
0x0000000000400509 <main+30>: bf 28 06 40 00 mov $0x400628,%edi
..
0x400507 <main+28>: 0x28bf0c74
我的结论是对的吗?
答案 0 :(得分:61)
不,Intel CPU是小端:http://en.wikipedia.org/wiki/Endianness
答案 1 :(得分:18)
首先,您需要知道几乎所有现代CPU都可以操作的最小数据单元是一个8位的字节。对于数字,我们(人类)从左到右书写和读取,我们首先写出最重要的数字,所以最重要的数字在左边。
little-endian意味着CPU的两件事:
假设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
当CPU将整数值0x00183CFF写入内存时也是如此。它将0xFF置于最低地址,将0x00置于最高地址。如果您(人类)直观地从低地址到高地址读取字节,则读出FF 3C 18 00,这是写入0x00183CFF的相反顺序。
对于BIG-endianness,CPU在较低地址读取和写入MSB,在较高地址读取LSB。