⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 cpuid.cpp

📁 获取CPU信息的类
💻 CPP
字号:
////////////////////////////////////////////////////////////
// 文 件 名: cpuid.cpp
// 功    能: 通过 cpuid 指令, 获取 CPU 信息, 详见cpuid.h
// 编译环境: VC++ 6.0 (Windows XP SP2)
// 作    者: boer      
//           bo_er@msn.com
// 日    期: 2007-8-15
// 参考资料: <<Intel(R) 64 and IA-32 Architectures
//					   Software Developer's Manual
//									  Volume 2A:>>
//				    Instruction Set Reference, A-M
//				        Order Number: 253666-023US
//				                   May 2007(2007-3)
////////////////////////////////////////////////////////////


#include "stdafx.h"
#include "cpuid.h"

void CCPUID::Run()
{
	unsigned long IsSupportCPUID = 0;
	unsigned long BaseMaxVal, ExMaxVal;
	unsigned long VerInfo;	// Version Information: Type,Family,Model,Stepping ID
	unsigned long BaseFeatureInfo, ExFeatureInfo, FeatureInfo;

	unsigned long CacheTLB[4], ProcessorSN[2];
	unsigned long ExFeature, ThreadCore;
	char cFactory[13], cProcessorStr[49];

	//-----------------检测是否支持 CPUID 指令---------------
	_asm
	{
		pushfd
		pop  eax
		mov  ecx, eax
		xor  eax,200000h    ;求反D21, 如果可以改写, 说明支持 CPUID 指令.
		push eax
		popfd
		pushfd
		pop  eax
		xor  eax,ecx
		mov IsSupportCPUID, eax
	}
	bIsSupportCPUID = IsSupportCPUID;

	if(!bIsSupportCPUID)
		return;
	//----------------- 不支持 CPUID 指令就退出 ------------->


	cFactory[12] = '\0';
	_asm
	{
		xor eax, eax
		cpuid
		mov BaseMaxVal,		       eax
		mov dword ptr cFactory,    ebx		// 厂商信息
		mov dword ptr cFactory+4,  edx
		mov dword ptr cFactory+8  ,ecx

		mov eax, 1
		cpuid
		mov VerInfo,         eax
		mov BaseFeatureInfo, ebx
		mov ExFeatureInfo,   ecx 
		mov FeatureInfo,     edx

		mov eax, 0x80000000
		cpuid
		mov ExMaxVal, eax

		mov eax, 0x80000001
		cpuid
		mov ExFeature, edx

		mov eax, 0x80000002
		cpuid
		mov dword ptr cProcessorStr    , eax
		mov dword ptr cProcessorStr + 4  , ebx
		mov dword ptr cProcessorStr + 8  , ecx
		mov dword ptr cProcessorStr + 12  ,edx

		mov eax, 0x80000003
		cpuid
		mov dword ptr cProcessorStr + 16  , eax
		mov dword ptr cProcessorStr + 20  , ebx
		mov dword ptr cProcessorStr + 24  , ecx
		mov dword ptr cProcessorStr + 28  , edx

		mov eax, 0x80000004
		cpuid
		mov dword ptr cProcessorStr + 32  , eax
		mov dword ptr cProcessorStr + 36  , ebx
		mov dword ptr cProcessorStr + 40  , ecx
		mov dword ptr cProcessorStr + 44  , edx
  }

  if( BaseMaxVal >= 2 )
  {
    _asm
    {
      mov eax, 2
      cpuid
      mov CacheTLB[0], eax
      mov CacheTLB[4], ebx
      mov CacheTLB[8], ecx
      mov CacheTLB[12],edx
    }
	for(int i=0; i<4; i++)
		dwCacheTLB[i] = CacheTLB[i];

  }

  if(BaseMaxVal == 3)
  {
    _asm
    {
      mov eax, 3
      cpuid
      mov ProcessorSN[0], ecx
      mov ProcessorSN[4], edx
    }
  }

  iThreads = 0;
  iCores   = 0;

  if(BaseMaxVal >=4)
  {
	  _asm
	  {
		  mov eax, 4
		  mov ecx, 0
		  cpuid
		  mov ThreadCore, eax
	  }

    iThreads = (ThreadCore & 0x03FFC000) >> 14;
	iCores   = (ThreadCore & 0xFC000000) >> 26;
  }
	iThreads++;
	iCores++;


	dwBaseMaxValue = BaseMaxVal;
	dwExMaxValue = ExMaxVal;
	dwVerInfo = VerInfo;
	dwBaseFeatureInfo = BaseFeatureInfo;
	dwExFeatureInfo = ExFeatureInfo;
	dwFeatureInfo = FeatureInfo;

	iBrandIndex = (BaseFeatureInfo & 0x0FF);
	dwExFeature = ExFeature;

	strcpy(sFactory, cFactory);
	strcpy(sProcessorStr, cProcessorStr);

	VI.iFamily		= ((VerInfo & 0x0F00) >> 8);
	VI.iModel		=  ((VerInfo & 0x0F0) >> 4);
	VI.iSteppingID	= (VerInfo & 0x0F);
	VI.iExFamily	= ((VerInfo & 0x0FF00000) >> 20);
	VI.iExModel	= ((dwVerInfo & 0x0F0000) >> 16);

	bEST   = ( (dwExFeatureInfo & 0x080) >> 7);
	bSSE3  = (dwExFeatureInfo & 0x01);
	bSSSE3 = ( (dwExFeatureInfo & 0x0200) >> 9);

	bMMX  = ( (dwFeatureInfo & 0x0800000) >> 23);
	bSSE  = ( (dwFeatureInfo & 0x02000000) >> 25);
	bSSE2 = ( (dwFeatureInfo & 0x04000000) >> 26);
	bHTT  = ( (dwFeatureInfo & 0x010000000) >> 28);

	bIntel64 = (ExFeature & 0x20000000) >> 29;
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -