// CpuId.cpp : 定义控制台应用程序的入口点。
//
#include "stdafx.h"
#include <stdio.h>
#include <string.h>
typedef int BOOL;
typedef unsigned int UINT32;
const int TRUE = 1;
void ExecuteCPUID(int &nEAX, int &nEBX, int &nECX, int &nEDX)
{
#if defined(_MSC_VER)
int nTempEAX = nEAX, nTempEBX, nTempECX, nTempEDX;
_asm
{
mov eax, nTempEAX
cpuid
mov nTempEAX, eax
mov nTempEBX, ebx
mov nTempECX, ecx
mov nTempEDX, edx
}
nEAX = nTempEAX;
nEBX = nTempEBX;
nECX = nTempECX;
nEDX = nTempEDX;
#elif defined(__GNUC__)
asm volatile ("cpuid"
: "=a"(nEAX), "=b"(nEBX), "=c"(nECX), "=d"(nEDX)
: "a"(nEAX)
);
#endif
}
BOOL GetCPUBrandString(char *szBuf)
{
int nEAX, nEBX, nECX, nEDX; // 四个寄存器的值
const UINT32 BRANDID = 0x80000002; // 从0x80000002开始,到0x80000004结束
char szBrand[sizeof(UINT32)*4*3+1]; // 用来存储商标字符串,48个字符
memset(szBrand, 0, sizeof(szBrand)); // 初始化为0
for (int i = 0; i < 3; i++) // 依次执行3个指令
{
nEAX = BRANDID + i;
ExecuteCPUID(nEAX, nEBX, nECX, nEDX);
// 每次执行结束后,保存四个寄存器里的asc码到数组
memcpy(szBrand + sizeof(UINT32) * (i*4 + 0), &nEAX, sizeof(UINT32));
memcpy(szBrand + sizeof(UINT32) * (i*4 + 1), &nEBX, sizeof(UINT32));
memcpy(szBrand + sizeof(UINT32) * (i*4 + 2), &nECX, sizeof(UINT32));
memcpy(szBrand + sizeof(UINT32) * (i*4 + 3), &nEDX, sizeof(UINT32));
}
strcpy(szBuf, szBrand);
return TRUE;
}
int main()
{
char szBuf[100];
GetCPUBrandString(szBuf);
printf("%s\n", szBuf);
getchar();
}