【问题标题】:Is x86-64 machine language big endian?x86-64机器语言是大端吗?
【发布时间】:2011-08-26 11:29:36
【问题描述】:
0x0000000000400507 <main+28>:    74 0c  je     0x400515 <main+42>
0x0000000000400509 <main+30>:    bf 28 06 40 00 mov    $0x400628,%edi

..

0x400507 <main+28>: 0x28bf0c74

我认为显示机器代码是大端的。我的结论对吗?

【问题讨论】:

    标签: assembly x86-64 endianness machine-code


    【解决方案1】:

    首先,您需要知道几乎所有现代 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,地址越高,该地址上的字节就越重要。

    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。

    【讨论】:

      【解决方案2】:

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

      【讨论】:

      • 哎呀,我好像读错了字节序,再次...有什么技巧可以避免这种问题吗?
      • @kern:little-endian 的最低有效字节在前,这与最低有效数字在最后的书面数字相反。所以必须反转 0x400628(实际上是 0x00400628)以获得 28 06 40 00 意味着它的小端。
      • 这有助于理解,因为计算机在屏幕上从左到右从字符串缓冲区中的最低内存地址开始打印,所以最低的内存地址将在左侧,最高的将在左侧右边。
      • ...因此,小端是“先打印小端”,而大端是“先打印大端”。 Idk,可能没有帮助......
      • Little-endian 应该被称为 little-startian。
      猜你喜欢
      • 2023-03-22
      • 2015-01-20
      • 2018-12-02
      • 2022-11-15
      • 2012-03-09
      • 1970-01-01
      • 2015-09-23
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多