我已将我的应用程序编译为使用x86指令集,但我需要以编程方式知道运行可执行文件的机器是否支持amd64指令集。有没有一种简单的方法可以找到它(可能使用CPUID
)?
应用程序需要能够在多个操作系统上运行,因此首选非基于操作系统的方法。
答案 0 :(得分:4)
您正在寻找能够检测Long mode的代码。
如果处理器可以进入长模式,CPUID扩展属性字段中的一个位可以通过实模式或受保护模式通知程序,这允许程序检测x86-64处理器。这类似于Intel IA-64处理器用于允许程序检测它们是否在IA-32仿真下运行的CPUID属性位。
有问题的标志是CPUID
query for 80000001h
的EDX
中的第29位。
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()