CPUID指令

 cpuid就是一条读取CPU各种信息的一条指令,大概是从80486的某个版本开始就存在了。似乎是从80386开始,当CPU被RESET以后,CPU会在EDX寄存器中返回一个32bits的CPU签名(Processor Identification Signature),但这时候CPU还没有CPUID这条指令,后来出现了这条指令后,软件无需以来CPU复位就可以读出这个CPU签名,同时还可以读出很多CPU的相关信息。

 CPUID这条指令,除了用于识别CPU(CPU的型号、家族、类型等),还可以读出CPU支持的功能(比如是否支持MMX,是否支持4MB的页等等),内容的确是十分丰富。CPUID指令有两组功能,一组返回的是基本信息,另一组返回的是扩展信息,本文介绍基本信息部分,扩展信息部分下篇中介绍。本文所在程序或程序片段,均使用MASM 6.11编译连接,可以在DOS(包括虚拟机的DOS下)运行。

如何判断CPU是否支持CPUID指令

 前面说过,大概是从80486开始才有的cpuid这个指令,是不是所有的80486家族CPU都有这个指令我也不是很清楚,但在EFLAGS中的bit 21可以识别CPU是否支持CPUID指令,如下图:

CPUID指令_第1张图片

 在8086和8088CPU中,FLAGS只有16位长,在80386CPU中,bit 21被保留未用,在支持CPUID指令的CPU中,这一位将为1。

CPUID指令的执行方法

 把功能代码放在EAX寄存器中,执行CPUID指令即可。例如:
    mov eax,1
    cpuid
 前面说过CPUID指令分为两组,一组返回基本信息,一组返回扩展信息,当执行返回基本信息的CPUID指令时,EAX中功能代码的bit 31为0,当执行返回扩展信息的CPUID指令时,EAX中的功能代码的bit 31为1。那么不管是那组功能,如何知道EAX中的功能代码最大可以是多少呢?根据Intel的说明,可以用如下方法:
mov eax,0
cpuid
 执行完CPUID指令后,EAX中返回的值就是返回基本信息时,功能代码的最大值,在执行CPUID指令要求返回基本信息时,EAX中的值必须小于或等于该值。
mov eax,80000000h
cpuid
 执行完CPUID指令后,EAX中返回的值就是返回扩展信息时,功能代码的最大值,在执行CPUID指令要求返回扩展信息时,EAX中的值必须小于或等于该值。
 由于很多编译器都不能编译CPUID指令,所以了解CPUID指令的操作码是必要的,CPUID指令的操作码是:
 ofa2h

返回基本信息的功能全貌

 在实际介绍每一个功能之前,我们先通过一张图了解一下返回基本信息的功能全貌。

CPUID指令_第2张图片
CPUID指令_第3张图片

EAX=0:获取CPU的Vendor ID

Vendor ID这个东西,实际上就是制造商的标识,用下面的方法执行该功能:

mov eax,0
cpuid
 执行CPUID指令后,AX中返回的内容前面已经说过了,返回的Vendor ID固定为12个ASCII字符依次存放在EBX、EDX、ECX中,对于Intel的CPU,返回的字符串永远是:GenuineIntel。对应在三个寄存器中的值如下:
     EBX=756E6547h,EDX=49656E69h,ECX=6C65746Eh
 尽管本文是介绍Intel的CPUID指令,但下面还是尽我所知,列出其它厂家生产的IA-32架构CPU的Vendor ID,希望能对需要这些资料的人有所帮助。

AMDisbetter! ---- 早期AMD K5芯片的工程样品芯片
AuthenticAMD ---- AMD
CentourHauls ---- Centour
CyrixInstead ---- Cyrix
GenuineTMx86 或 TransmetaCPU ---- Transmeta
Geode by NSC ---- National Semiconductor
NexGenDriven ---- NexGen
SiS SiS SiS  ---- SiS
RiseRiseRise ---- Rise
UMC UMC UMC  ---- UMC
VIA VIA VIA  ---- VIA

EAX=1:处理器签名(Processor Signiture)和功能(Feature)位

mov eax,1
cpuid
  执行完成后,处理器签名放在EAX中,功能位及其它杂七杂八的内容分别放在EBX、ECX和EDX中。

处理器签名(Processor Signiture):
返回在EAX中,定义如下:

这里写图片描述
图中的灰色区域表示没有定义。前面说过,当CPU复位时,会在EDX中返回处理器签名,从80486以后,这个签名和上面的定义完全一样,只是放在不同的寄存器中而已。前面还提到过,80386在复位时也返回处理器签名,但80386返回的签名格式是和上面不同的,后面可能会提到。

  通过处理器签名,可以确定CPU的具体型号,以下是部分Intel CPU的处理器签名数据(资料来自Intel):

CPUID指令_第4张图片

  前面说过,80386尽管没有CPUID指令,但在复位时也是可以返回处理器签名的,下面是80386返回的处理器签名的格式:

CPUID指令_第5张图片

你可能感兴趣的:(汇编)