CPUID – processor identification
指令:CPUID,用于返回处理器支持的功能信息及特性信息。比如,是否支持温度及电源管理功能、高速缓存的数量、逻辑处理器的数量 等等。
参数:使用 EAX 指定功能号,即要返回的信息,有时需要使用 ECX 寄存器;
返回:在 EAX、EBX、ECX、EDX 中,保存返回信息;
检测处理器是否支持该指令
从 80486 处理器的后期,引入该指令。因此,在使用前,应该先检测处理器是否支持该指令:
1)在 32-bit 处理器上,如果 EFLAGS 的 21 位为 “0”,表示不支持该指令;
2)如果为 “1”,表示支持该指令;
最大功能号
EAX 用于指定功能号,但是不能超过 CPUID 支持的最大功能号。
因此,在使用该指令前,应该使用 0 号功能获取最大功能号:
mov eax, 0 cpuid
并且,0 号功能会在 EBX、ECX、EDX 中保存处理器供应商的信息:
EBX => Genu,“G” 在 BL 中 ECX => inel,“l” 在 CL 中 EDX => ntel,“n” 在 DL 中
对于 Intel 处理器是 GenuineIntel 字符串。
获取处理器品牌信息
如下示例,获取当前处理器的品牌信息,使用 0x80000002-0x80000004 号功能:
mov eax, 0x80000002 cpuid // mov eax, 0x80000003 cpuid // mov eax, 0x80000004 cpuid //
当然,在每次执行 cpuid 后,应该将 EAX EBX ECX EDX 内容保存下载(上面的程序没有体现这一点),因为其中存有处理器的品牌信息。
LEA – load effective address
NOP – no operation
UD2 – undefined instruction
XLAT – table lookup translation
XLATB – table lookup translation
参考文献
Miscellaneous Instructions – x86 Assembly Language Reference Manual