您正在寻找检测长模式的代码。
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)