首页 > 解决方案 > 在运行时以编程方式检测 CPU 架构

问题描述

是否可以通过低级代码(C/C++ 或汇编)在不从操作系统或某些 API 收集信息的情况下检查 x86/x86-64 CPU 中的 CPU 架构(64 位或 32 位)?

可以检查指针的大小,就像在此处讨论的那样,但是,据我了解,这种方式可以让您知道操作系统架构是为编译的,因为运行 32 位操作系统的 64 位 CPU 会报告错误的结果。

也许一些cpuid指令或类似的东西可以解决问题,但我找不到任何完全满足这些要求的东西。如果您认为这是不可能的,我希望有充分的理由来证明这一点(这可能是一个不太客观的答案)。如果您想知道,这是一个 CPU 检测软件。

编辑:在确定 32/64 bit architecture in assembly 中,OP 没有得到一些具体的答案来解释如何做到这一点,只是你应该使用 cpuid,并链接到How do you detect the CPU architecture type during run-time with GCC和内联汇编?,这对我来说是一个很好的答案,但它不如我标记为已接受的答案那么完整,因为 Remy Lebeau 给出了详细的解释并告诉了必须查询哪个特定的 cpuid 位,而不仅仅是编写一些代码,并且我发现它更适合我的问题,因为它在更高级别的范围内进行了解释(我从未提到 gcc,第二篇文章提到了)

标签: c++cassemblycpu-architecture

解决方案


可以为在 32 位或 64 位模式下运行的 x86 编写代码。如果您正在运行此类代码,则可以使用以下命令检查您所处的模式:

get_mode:
        mov eax, 1
        dec eax
        test eax, eax
        ret

在 64 位模式下,dec eax成为测试指令的 REX.W 前缀。因此,此代码在 32 位模式下运行时返回 0,而在 64 位模式下运行时返回 1。它还相应地设置 Z,因此可以从另一个汇编语言函数中使用它,如下所示:

        call get_mode
        jnz mode64

推荐阅读