通过CPUid获取CPU信息

获取CPU的方法是CPUid,网上说这些指令集只有在Intel 486   CPU,Cyrix M1   CPU, AMD Am486   CPU有,应该是主流的。


总的来说,cpu有一套指令来查询,但是这个是汇编的语言,在C++中可以用__asm{}里面调用汇编语言,现在把这个封装在里面

注意__asm{}只能调用本地变量,不知道是不是和存储的位置相关,调用一次ExeCPUID就会把一些值放在de的变量中,在通过memcpy来获取

#include "windows.h" 

#include "iostream"
#include "string"
using namespace std;
class T
{
public:
//用来存储信息
DWORD m_deax;
DWORD m_debx;
DWORD m_decx;
DWORD m_dedx;

void ExeCPUID(DWORD veax)//初始化CPU
{
DWORD deax;
DWORD debx;
DWORD decx;
DWORD dedx;
__asm
{
mov eax,veax
cpuid
mov deax,eax
mov debx,ebx
mov decx,ecx
mov dedx,edx
}
m_deax = deax;
m_debx = debx;
m_decx = decx;
m_dedx = dedx;
}


long GetCPUFreq()//获取CPU频率,单位: MHZ
{
int start1,start2;
_asm rdtsc
_asm mov start1,eax
Sleep(50);
_asm rdtsc
_asm mov start2,eax
return (start2-start1)/50000;
}


string GetManID()//获取制造商信息
{
char ID[25];//存储制造商信息
memset(ID,0,sizeof(ID));//先清空数组 ID
ExeCPUID(0);//初始化
memcpy(ID+0,&m_debx,4);//制造商信息前四个字符复制到数组
memcpy(ID+4,&m_dedx,4);//中间四个
memcpy(ID+8,&m_decx,4);//最后四个
//如果返回 char * ,会出现乱码;故返回 string 值
return string(ID);
}


string GetCPUType()
{
const DWORD id = 0x80000002; //从0x80000002开始,到0x80000004结束
char CPUType[49];//用来存储CPU型号信息
memset(CPUType,0,sizeof(CPUType));//初始化数组


for(DWORD t = 0 ; t < 3 ; t++ )
{
ExeCPUID(id+t);
//每次循环结束,保存信息到数组
memcpy(CPUType+16*t+ 0,&m_deax,4);
memcpy(CPUType+16*t+ 4,&m_debx,4);
memcpy(CPUType+16*t+ 8,&m_decx,4);
memcpy(CPUType+16*t+12,&m_dedx,4);
}
return string(CPUType);
}
};




void main() 

T t;
cout<<"本机cpu信息如下:"<<endl;
cout<<"cpu 主 频: "<<t.GetCPUFreq()<<" mhz"<<endl;
cout<<"cpu 制造商: "<<t.GetManID()<<endl;
cout<<"cpu 型 号: "<<t.GetCPUType()<<endl;
cin.get();


}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值