【问题标题】:x86 assembly to programmatically determine endianessx86 程序集以编程方式确定字节顺序
【发布时间】:2014-03-29 16:57:58
【问题描述】:

我知道英特尔 x86 是小端。但是,我将如何编写程序集来以编程方式确定处理器的字节序?

【问题讨论】:

  • 虽然你可以这样做,但这没有意义。由于您正在使用某种汇编语言编写代码,因此您已经知道答案了。
  • 一些处理器具有可配置的字节顺序 (ARM)。如果代码需要可重用,这可能会解释它。

标签: assembly x86 endianness


【解决方案1】:

存储一个单词,每个单词的两个字节都有不同的值(例如0x0001)。从同一地址加载一个字节,并检查它与原始单词的哪个字节匹配。

【讨论】:

    【解决方案2】:

    在 C 中实现它,因为 C 可以移植到其他体系结构。我们已经知道英特尔是小端的。在汇编中实现它是没有用的。如果检测到 Little endian,则此示例返回 1,否则返回 0。

    int host_endian()
    {
        static const union {
            uint16_t    i;
            uint8_t     c[2];
        } test = { 0x1234 };
    
        return (test.c[0] == 0x34) ? 1 : 0;
    }
    

    【讨论】:

    • 如果您存储0x0001,您可以return test.c[0] 无需比较。但请注意,对于大于 2 chars 的类型,C 不保证主机是大端或小端。例如,PDP-endian is a real possibility。但这确实确定了 2 字节字节序。 (不过,它只能在支持uint8_tuint16_t 的机器上编译,所以可能不会在许多具有 9 位“字节”或 36 位字之类的东西的深奥机器上编译。)当然,很多代码都没有甚至不要尝试移植到这样的历史机器上。
    猜你喜欢
    • 2010-11-03
    • 1970-01-01
    • 1970-01-01
    • 2011-10-22
    • 2012-03-17
    • 2013-10-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多