📄 cpuid.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 + -