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

DrN*_*oob 0 c c++ assembly cpu-architecture

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

可以检查指针的大小,就像这里讨论的那样,但是,根据我的理解,这种方式可以让你知道OS体系结构的编译,因为运行32位操作系统的64位CPU会报告错误的结果.

也许一些cpuid指令或类似可以做到这一点,但我找不到任何完全满足这些要求的东西.如果你认为这是不可能的,我会很高兴有理由证明这一点(这可能是一个不太客观的答案).如果您想知道,这是一个CPU检测软件.

编辑:在装配中确定32/64位体系结构时,OP没有得到解释如何操作的特定答案,只是你应该使用cpuid,并链接到如何在运行时使用GCC检测CPU体系结构类型和内联asm?,这显示了一个很好的答案,但它没有我标记为接受的答案那么完整,因为Remy Lebeau给出了详细的解释,并告诉必须查询哪个特定的cpuid位,而不是仅仅编写一些代码,以及我发现它对我的问题更合适,因为它是在更高级别的范围内解释的(我从未提及gcc,第二篇文章的确如此)

prl*_*prl 5

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

get_mode:
        mov eax, 1
        dec eax
        test eax, eax
        ret
Run Code Online (Sandbox Code Playgroud)

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

        call get_mode
        jnz mode64
Run Code Online (Sandbox Code Playgroud)

  • 这是否回答了OP的问题?形成OP关于检查指针大小的内容,我猜OP对CPU的当前操作模式不感兴趣,但是CPU的基本功能是什么? (2认同)

Rem*_*eau 5

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

如果您为 32 位编译可执行文件,则 CPU可能是 32 位或 64 位(如果 64 位 CPU 能够运行 32 位代码),因此您必须查询 CPU 以进行区分。最好尽可能从操作系统获取该信息,但 CPU可能会查询该信息。

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

CPUID有一个“获取供应商 ID”查询来确定 CPU 制造商。


归档时间:

查看次数:

850 次

最近记录:

7 年,3 月 前