使用Visual C++编程取得CPU信息

  • 来源: 互联网 作者: rocket   2008-03-18/11:30
  • 利用利用CPUID 汇编指令(机器码:0FH A2H, 如果你的编译器不支持CPUID 指令,只有emit 机器码了), 该指令可以被如下CPU识别:

    Intel 486 以上的CPU,

    Cyrix M1 以上的CPU,

    AMD Am486 以上的CPU

    (1) 取CPU OEM 字符串, 判断CPU 厂商

    先让EAX=0, 再调用CPUID

    Inel的CPU将返回:

    EBX:756E6547H 'Genu'
    EDX:49656E69H 'ineI'
    ECX:6C65746EH 'ntel'
    EBX,EDX,ECX 将连成"GenuineIntel", 真正的Intel。

    Cyrix 的CPU 将返回:

    EBX:43797269H
    EDX:78496E73H
    ECX:74656164H
    "CyrixInstead","Cyrix 来代替"。

    AMD 的CPU 将返回:

    EBX:41757468H
    EDX:656E7469H
    ECX:63414D44H
    "AuthenticAMD", 可信的AMD。

    在Windows98中,用右键单击"我的电脑",选择" 属性- 常规"在计算机描述 处就可看见CPU OEM 字符串。

    (2)CPU 到底是几86, 是否支持MMX

    先让EAX=1,再调用CPUID

    EAX的8到11位就表明是几86

    3 - 386
    4 - i486
    5 - Pentium
    6 - Pentium Pro Pentium II
    2 - Dual Processors

    EDX 的第0位:有无FPU

    EDX的第23位:CPU是否支持IA MMX,很重要啊 !如果你想用那57条新增的指 令,先检查这一位吧,否则就等着看Windows 的"该程序执行了非法指令,将被关 闭" 吧。

    (3) 专门检测是否P6架构

    先让EAX=1,再调用CPUID

    如果AL=1,就是Pentium Pro 或Pentium II

    (4) 专门检测AMD的CPU信息

    先让EAX=80000001H,再调用CPUID

    如果EAX=51H, 是AMD K5

    如 果EAX=66H, 是K6

    EDX第0 位: 是否有FPU( 多余的 !谁用过没FPU的K5,K6?)

    EDX 第23 位,CPU是否支持MMX,

    程序如下:

    //------CPUID Instruction Demo Program------------
    #include
    #include
    #pragma hdrstop
    //------------------------------------------------
    #pragma inline
    #pragma argsused
    int main(int argc, char **argv)
    {
    char OEMString[13];
    int iEAXValue,iEBXValue,iECXValue,iEDXValue;
    _asm {
    mov eax,0
    cpuid
    mov DWORD PTR OEMString,ebx
    mov DWORD PTR OEMString+4,edx
    mov DWORD PTR OEMString+8,ecx
    mov BYTE PTR OEMString+12,0
    }
    cout< < "This CPU 's OEM String is:"< < OEMString< < endl;
    _asm {
    mov eax,1
    cpuid
    mov iEAXValue,eax
    mov iEBXValue,ebx
    mov iECXValue,ecx
    mov iEDXValue,edx
    }
    if(iEDXValue&0x800000)
    cout < < "This is MMX CPU"< < endl;
    else
    cout < < "None MMX Support."< < endl;
    int iCPUFamily=(0xf00 & iEAXValue) > >8;
    cout < < "CPU Family is:"< < iCPUFamily< < endl;
    _asm{
    mov eax,2
    CPUID
    }
    if(_AL==1)
    cout < < "Pentium Pro or Pentium II Found";
    getch();
    return 0;
    }

    评论 {{userinfo.comments}}

    {{money}}

    {{question.question}}

    A {{question.A}}
    B {{question.B}}
    C {{question.C}}
    D {{question.D}}
    提交

    驱动号 更多