「x86」- 杂项指令

  CREATED BY JENKINSBOT

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