在运行时以编程方式检测CPU架构

时间:2018-06-21 22:18:48

标签: c++ c assembly cpu-architecture

是否可以通过低级代码(C / C ++或程序集)检查x86 / x86-64 CPU中的CPU体系结构(64位还是32位),而无需从OS或某些API收集信息?

可以像上面讨论的here那样检查指针的大小,但是据我所知,这种方式可以让您知道OS体系结构是针对其编译的,因为运行32位OS的64位CPU会报告错误的结果。

也许有些cpuid指令或类似的指令可以解决问题,但是我找不到完全满足这些要求的东西。如果您认为这是不可能的,那么我很乐意为您辩解(这可能是一个不太客观的答案)。如果您想知道,这是用于CPU检测软件的。

编辑: 在Determine 32/64 bit architecture in assembly中,OP并没有得到解释该操作方法的特定答案,只是您应该使用cpuid,并链接到How do you detect the CPU architecture type during run-time with GCC and inline asm?,这对我来说是一个很好的答案,但事实并非如此。就像我标记为接受的答案一样完整,因为Remy Lebeau给出了详细的解释并告诉您必须查询哪个特定的cpuid位,而不仅仅是编写一些代码,而且我发现它更适合我的问题,因为在更高层次的范围(我从没提到过gcc,第二篇文章确实如此)

2 个答案:

答案 0 :(得分:5)

可以为以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

答案 1 :(得分:3)

如果将可执行文件编译为64位,则CPU必须仅是64位。

如果将可执行文件编译为32位,则CPU 可以为32位或64位(如果64位CPU能够运行32位代码),因此必须查询CPU来区分。最好在可能的情况下从操作系统获取该信息,但是CPU 可能有自己的查询信息。

例如,在x86或x86-64 CPU上,有CPUID条指令可用:

CPUID有一个"Extended Processor Info and Feature Bits"查询,以确定CPU制造商。