首页  编辑  

用程序取得CPU信息攻略

Tags: /超级猛料/Hardware.硬件相关/CPU相关/   Date Created:

用程序取得CPU信息攻略  

function GetCPUVendor : string;

type

 TVendor = array[0..11] of char;

 function _CPUVendor : TVendor; assembler; register;

 asm

   PUSH    EBX {Save affected register}

   PUSH    EDI

   MOV     EDI,EAX {@Result (TVendor)}

   MOV     EAX,0

   DW      $A20F {CPUID Command}

   MOV     EAX,EBX

   XCHG EBX,ECX     {save ECX result}

   MOV ECX,4

 @1:

   STOSB

   SHR     EAX,8

   LOOP    @1

   MOV     EAX,EDX

   MOV ECX,4

 @2:

   STOSB

   SHR     EAX,8

   LOOP    @2

   MOV     EAX,EBX

   MOV ECX,4

 @3:

   STOSB

   SHR     EAX,8

   LOOP    @3

   POP     EDI {Restore registers}

   POP     EBX

 end;

begin

 Result := _CPUVendor;

end;

---------------------------------------

发信人: hephaestus()

原创作者:Hephaestus(就是我)  

很久以来BBS总是求助的人多,贡献的人少,本人特献上拙作,希望对初学者有所

帮助!  

转载时请注明作者.  

很多软件可以判断所运行的电脑类型而自动做不同的处理。如PhotoShop 5可以探

测CPU是否有MMX支持而调用不同的处理函数,《金山词霸》发现有MMX支持会产生

半透明的翻译提示,很多软件可以区分Intel,Cyrix,AMD的CPU...  

现在,且让我细细道来如何让你在自己的程序中取得CPU信息。  

主要可利用利用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  

K7是什么标志,只有等大家拿到K7的芯再说了。  

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

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

程序如下:是一个控制台程序,可以给出你的"心"的信息。如果把这个技术用于

DLL中,便可以使VB程序也知道"心"的信息。  

//------CPUID Instruction Demo Program------------  

#include <conio.h>  

#include <iostream.h>  

#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;

}