0x0000000000400507 <main+28>: 74 0c je 0x400515 <main+42>
0x0000000000400509 <main+30>: bf 28 06 40 00 mov $0x400628,%edi
..
0x400507 <main+28>: 0x28bf0c74
我认为显示机器代码是大端的。我的结论对吗?
0x0000000000400507 <main+28>: 74 0c je 0x400515 <main+42>
0x0000000000400509 <main+30>: bf 28 06 40 00 mov $0x400628,%edi
..
0x400507 <main+28>: 0x28bf0c74
我认为显示机器代码是大端的。我的结论对吗?
不,英特尔 CPU 是小端:http ://en.wikipedia.org/wiki/Endianness
首先,您需要知道几乎所有现代 CPU 可以操作的最小数据单元是一个字节,即 8 位。对于数字,我们(人类)从左到右写和读,我们先写最高位,所以最高位在左边。
Little-endian 字节顺序对 CPU 意味着两件事:
假设 CPU 从内存中取出 4 个字节,例如从 address 开始0x00
,并且:
0x00
保存字节11111111
,即0xFF
;0x01
保存字节00111100
,即0x3C
;0x02
保存字节00011000
,即0x18
;0x03
保存字节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
0x00183CFF
内存时,同样的情况也适用。它将放在0xFF
最低地址和0x00
最高地址。如果您(人类)直观地从低地址到高地址读取字节,您会读出,哪个字节与字节的写入FF 3C 18 00
顺序相反。0x00183CFF
对于 BIG-endianness,CPU 读取和写入低地址的 MSB 和高地址的 LSB。