分类: C/C++
2008-12-24 15:56:27
#pragma once
#include "stdafx.h"
#include
#include
#include "GetCpuInfo.h"
class CPUID
{
public:
CString GetVID();
CString GetBrand();
bool IsHyperThreading();
bool IsEST() ;
bool IsMMX();
private:
void Executecpuid(DWORD eax); // 用来实现cpuid
DWORD m_eax; // 存储返回的eax
DWORD m_ebx; // 存储返回的ebx
DWORD m_ecx; // 存储返回的ecx
DWORD m_edx; // 存储返回的edx
};
void CPUID::Executecpuid(DWORD veax)
{
// 因为嵌入式的汇编代码不能识别 类成员变量
// 所以定义四个临时变量作为过渡
DWORD deax;
DWORD debx;
DWORD decx;
DWORD dedx;
__asm
{
mov eax, veax ;//将输入参数移入eax
cpuid ;//执行cpuid
mov deax, eax ;//以下四行代码把寄存器中的变量存入临时变量
mov debx, ebx
mov decx, ecx
mov dedx, edx
}
m_eax = deax; // 把临时变量中的内容放入类成员变量
m_ebx = debx;
m_ecx = decx;
m_edx = dedx;
}
CString CPUID::GetVID()
{
char cVID[13]; // 字符串,用来存储制造商信息
memset(cVID, 0, 13); // 把数组清0
Executecpuid(0); // 执行cpuid指令,使用输入参数 eax = 0
memcpy(cVID, &m_ebx, 4); // 复制前四个字符到数组
memcpy(cVID+4, &m_edx, 4); // 复制中间四个字符到数组
memcpy(cVID+8, &m_ecx, 4); // 复制最后四个字符到数组
return CString(cVID); // 以string的形式返回
}
CString CPUID::GetBrand()
{
const DWORD BRANDID = 0x80000002; // 从0x80000002开始,到0x80000004结束
char cBrand[49]; // 用来存储商标字符串,48个字符
memset(cBrand, 0, 49); // 初始化为0
for (DWORD i = 0; i < 3; i++) // 依次执行3个指令
{
Executecpuid(BRANDID + i);
memcpy(cBrand + i*16, &m_eax, 16); // 每次执行结束后,保存四个寄存器里的asc码到数组
} // 由于在内存中,m_eax, m_ebx, m_ecx, m_edx是连续排列
// 所以可以直接以内存copy的方式进行保存
return CString(cBrand); // 以string的形式返回
}
bool CPUID::IsHyperThreading() // 判断是否支持hyper-threading
{
Executecpuid(1); // 执行cpuid指令,使用输入参数 eax = 1
return m_edx & (1<<28); // 返回edx的bit 28
}
bool CPUID::IsEST() // 判断是否支持speed step
{
Executecpuid(1); // 执行cpuid指令,使用输入参数 eax = 1
return m_ecx & (1<<7); // 返回ecx的bit 7
}
bool CPUID::IsMMX() // 判断是否支持MMX
{
Executecpuid(1); // 执行cpuid指令,使用输入参数 eax = 1
return m_edx & (1<<23); // 返回edx的bit 23
}
chinaunix网友2010-03-17 12:37:19
在C++中使用cpuid指令获得CPU信息 : http://www.cnblogs.com/freeman/archive/2005/08/30/226128.html