Chinaunix首页 | 论坛 | 博客
  • 博客访问: 2649223
  • 博文数量: 416
  • 博客积分: 10220
  • 博客等级: 上将
  • 技术积分: 4193
  • 用 户 组: 普通用户
  • 注册时间: 2006-12-15 09:47
文章分类

全部博文(416)

文章存档

2022年(1)

2021年(1)

2020年(1)

2019年(5)

2018年(7)

2017年(6)

2016年(7)

2015年(11)

2014年(1)

2012年(5)

2011年(7)

2010年(35)

2009年(64)

2008年(48)

2007年(177)

2006年(40)

我的朋友

分类: 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
}

 

阅读(1164) | 评论(1) | 转发(0) |
给主人留下些什么吧!~~

chinaunix网友2010-03-17 12:37:19

在C++中使用cpuid指令获得CPU信息 : http://www.cnblogs.com/freeman/archive/2005/08/30/226128.html