1。先看看是那家公司的cpu,有intel的,还有amd的和 cyrix的。全世界只有三家,实际就是两家。

先让EAX=0,再调用CPUID    
Inel的CPU将返回:    
EBX:756E6547H   'Genu '    
EDX:49656E69H   'ineI '    
ECX:6C65746EH   'ntel '    
EBX,EDX,ECX将连成“GenuineIntel”,真正的Intel。

用CPUID指令,首先你可以确定你用的CPU是Intel的。 

 

Cyrix的CPU将返回:    
EBX:43797269H    
EDX:78496E73H    
ECX:74656164H    
“CyrixInstead”,“Cyrix来代替”。

   
AMD的CPU将返回:    
EBX:41757468H    
EDX:656E7469H    
ECX:63414D44H    
“AuthenticAMD ",可信的AMD。  

 

2.   得到系列号的高32位 和是否支持有系列号。
然后执行:
MOV   EAX,01H
CPUID
如果返回的EDX中,低18位为1,那么这个CPU就是支持序列号的。
此时EAX就是序列号的高32位。这32位对同一型号的CPU是一样的。 

 

3. 得到系列好的低64位。
再执行:
MOV   EAX,03H
CPUID
此时的EDX:ECX就是序列号的第64位。

 

代码如下:

#include <stdio.h>

#include <stdlib.h>
#include <string.h>
//#include <conio.h>


void main(void)
{
      unsigned char vendor_id_0[100] = "\0";
    unsigned char vendor_id_1[100] = "\0";
    unsigned char vendor_id_2[40]= "\0";
    unsigned char vendor_id_3[40]= "\0";
    unsigned char vendor_id_4[40]= "\0";
    unsigned char vendor_id_5[40]= "\0";
    unsigned char vendor_id_6[40]= "\0";
    unsigned int i_support_serial = 0;
    unsigned int i_first_serial = 0;
    unsigned int i_second_serial = 0;
    unsigned int i_third_serial = 0;
#if 1
    __asm
    (
        "movl $0,%%eax\n\t"
        "cpuid\n\t"
        "movl %%ebx,%0\n\t"
        "movl %%edx,%1\n\t"
        "movl %%ecx,%2\n\t"
        
        "movl $1,%%eax\n\t"
        "movl $0,%%edx\n\t"
        "cpuid\n\t"
        "movl %%edx,%3\n\t"
        "movl %%eax,%4\n\t"

        "movl $3,%%eax\n\t"
        "cpuid\n\t"
        "movl %%edx,%5\n\t"
        "movl %%ecx,%6\n\t"

        :"=m"(vendor_id_0),"=m"(vendor_id_1),"=m"(vendor_id_2),"=m"(i_support_serial),"=m"(i_first_serial),"=m"(i_second_serial),"=m"(i_third_serial)

    );
printf("id = %s,%s,%s,%x,%x,%x,%x\n",vendor_id_0,vendor_id_1,vendor_id_2,i_support_serial,i_first_serial,i_second_serial,i_third_serial);
  //i_support_serial  低18位为1,那么这个CPU就是支持序列号的。
  //i_first_serial 同一型号的CPU的id号(共96位,最高的32位)
  //i_second_serial  系列号的(次高的32位)
  //i_third_serial   系列号的(底32位)
    

#endif
    //printf("id = %s,%s\n",vendor_id_0,vendor_id_1);
}