检测系统是否可以运行amd64可执行文件

dor*_*ron 5 c c++ x86 x86-64

我编译了我的应用程序以使用x86指令集,但我需要以编程方式知道运行可执行文件的机器是否支持amd64指令集.有没有一种简单的方法可以找到它(可能使用CPUID)?

应用程序需要能够在多个操作系统上运行,因此首选非基于操作系统的方法.

Joh*_*ger 4

您正在寻找检测长模式的代码。

CPUID 扩展属性字段中的一位会通知实模式或保护模式下的程序处理器是否可以进入长模式,从而允许程序检测 x86-64 处理器。这类似于 Intel IA-64 处理器使用的 CPUID 属性位,允许程序检测它们是否在 IA-32 仿真下运行。

有问题的标志是查询EDX中的第 29 位。CPUID80000001h

指令CPUID基础设施有点冗长:如果您认为它CPUID甚至可用,那么您必须在启动确切的查询之前查询它实际上可以支持什么。然后您需要将寄存器结果放入您的变量中。


下面是一些用 C/C++ 内联汇编程序编写的代码。如果您使用的是 gcc,抱歉:您必须自己转换为(可怕的!)gasm 语法!

// Only on Pentium4 or above
// Only available on 32-bit
bool HasLongMode() {
    __asm {
        mov   eax,0x80000001 // Ask for processor features
        cpuid                // from the CPU
        xor   eax,eax        // Zero return value
        test  edx,0x20000000 // Check relevant bit
        setnz al             // Was bit set?
    } // __asm
} // HasLongMode()
Run Code Online (Sandbox Code Playgroud)