【发布时间】:2014-03-29 16:57:58
【问题描述】:
我知道英特尔 x86 是小端。但是,我将如何编写程序集来以编程方式确定处理器的字节序?
【问题讨论】:
-
虽然你可以这样做,但这没有意义。由于您正在使用某种汇编语言编写代码,因此您已经知道答案了。
-
一些处理器具有可配置的字节顺序 (ARM)。如果代码需要可重用,这可能会解释它。
标签: assembly x86 endianness
我知道英特尔 x86 是小端。但是,我将如何编写程序集来以编程方式确定处理器的字节序?
【问题讨论】:
标签: assembly x86 endianness
存储一个单词,每个单词的两个字节都有不同的值(例如0x0001)。从同一地址加载一个字节,并检查它与原始单词的哪个字节匹配。
【讨论】:
在 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_t 和uint16_t 的机器上编译,所以可能不会在许多具有 9 位“字节”或 36 位字之类的东西的深奥机器上编译。)当然,很多代码都没有甚至不要尝试移植到这样的历史机器上。