6

我正在阅读这个问题,并想知道接受的答案是否也可能是确定架构的一种方式。例如,在 asm 中,我可以将一个 WORD 压入堆栈,然后检查 SP。将新 SP 与旧 SP 进行比较:

Diff of 4 表示 32 位
Diff 8 表示 64 位

我的这种想法正确吗?

4

2 回答 2

6

不,因为堆栈的大小取决于您运行的模式(真实、受保护、long/64、vm86、smm 等),而不是基于架构。例如,如果您的程序集在保护模式下运行,您的堆栈将是 32 位(如果您的操作数是 16 位,则为 16 位),即使您的处理器是 x86-64。

就像评论中提到的某人一样,CPUID 是判断您的架构是什么的唯一可靠方法。

于 2010-04-02T20:47:02.180 回答
0

有关检测其运行模式的机器代码,请参阅返回 16、32 或 64 的 code-golf x86 机器代码函数:确定您的语言版本。相同的机器代码字节会根据解码的模式给出不同的结果。

或者对于 32 与 64,请参阅在运行时检测 64 位模式的 x86-32 / x86-64 多语言机器代码片段?

在大多数情况下,您不需要检测当前模式,因为您知道您的代码是为了什么而编译/汇编的。(例如在 NASM 中%ifidn __BITS__ 32,或检查%ifidn __OUTPUT_FORMAT__, elf32在 YASM 中也可以使用。)


无论当前模式如何,要检测 CPU 功能,请使用 CPUID。 您如何在运行时使用 GCC 和内联 asm 检测 CPU 架构类型? (或使用cpuid.h如何在 Linux 中调用“cpuid”?

这仍然不能告诉您正在运行的操作系统是否支持 64 位可执行文件;如果您想知道您应该只检查您是否在 64 位操作系统下运行。CPUID 无法帮助您:32 位程序查询操作系统的机制当然是特定于操作系统的。

在几乎所有情况下,IMO 的 CPU 的“架构”都不是正确的问题。(即除非您正在编写自己的内核或编写 CPU 信息程序)。知道它并不能帮助您的程序决定要做什么。

仅 32 位的 x86 CPU 已经很多年没有制造出来了,而且越来越少见。但是 32 位操作系统仍在支持 64 位的 CPU 上使用。

于 2018-06-21T23:18:16.320 回答