總共有兩種方式,原理都是一樣,只是一種沒整合,一種整合成函數了.
第一種沒整合過的:
int _tmain(int argc, _TCHAR* argv[])
{
char buf[256];
int a, b, c, d;
_asm {
mov eax, 80000002h
cpuid
mov a, eax
mov b, ebx
mov c, ecx
mov d, edx
}
buf[0] = a & 0xff;
buf[1] = (a & 0xffff) >> 8;
buf[2] = (a >> 16) & 0xff;
buf[3] = a >> 24;
buf[4] = b & 0xff;
buf[5] = (b & 0xffff) >> 8;
buf[6] = (b >> 16) & 0xff;
buf[7] = b >> 24;
buf[8] = c & 0xff;
buf[9] = (c & 0xffff) >> 8;
buf[10] = (c >> 16) & 0xff;
buf[11] = c >> 24;
buf[12] = d & 0xff;
buf[13] = (d & 0xffff) >> 8;
buf[14] = (d >> 16) & 0xff;
buf[15] = d >> 24;
_asm {
mov eax, 80000003h
cpuid
mov a, eax
mov b, ebx
mov c, ecx
mov d, edx
}
int i = 16;
buf[i+0] = a & 0xff;
buf[i+1] = (a & 0xffff) >> 8;
buf[i+2] = (a >> 16) & 0xff;
buf[i+3] = a >> 24;
buf[i+4] = b & 0xff;
buf[i+5] = (b & 0xffff) >> 8;
buf[i+6] = (b >> 16) & 0xff;
buf[i+7] = b >> 24;
buf[i+8] = c & 0xff;
buf[i+9] = (c & 0xffff) >> 8;
buf[i+10] = (c >> 16) & 0xff;
buf[i+11] = c >> 24;
buf[i+12] = d & 0xff;
buf[i+13] = (d & 0xffff) >> 8;
buf[i+14] = (d >> 16) & 0xff;
buf[i+15] = d >> 24;
_asm {
mov eax, 80000004h
cpuid
mov a, eax
mov b, ebx
mov c, ecx
mov d, edx
}
i = 32;
buf[i+0] = a & 0xff;
buf[i+1] = (a & 0xffff) >> 8;
buf[i+2] = (a >> 16) & 0xff;
buf[i+3] = a >> 24;
buf[i+4] = b & 0xff;
buf[i+5] = (b & 0xffff) >> 8;
buf[i+6] = (b >> 16) & 0xff;
buf[i+7] = b >> 24;
buf[i+8] = c & 0xff;
buf[i+9] = (c & 0xffff) >> 8;
buf[i+10] = (c >> 16) & 0xff;
buf[i+11] = c >> 24;
buf[i+12] = d & 0xff;
buf[i+13] = (d & 0xffff) >> 8;
buf[i+14] = (d >> 16) & 0xff;
buf[i+15] = d >> 24;
return 0;
}
第二種經過整合以後的:
void GetCPUInfo(int cpuinfo[4],int tp)
{
__asm
{
MOV eax,tp
cpuid
MOV edi,cpuinfo
MOV dword ptr[edi],eax
MOV dword ptr[edi+4],ebx
MOV dword ptr[edi+8],ecx
MOV dword ptr[edi+12],edx
}
}
int main(int argc, _TCHAR* argv[])
{
char cpuName[64]={0};
int (*pTmp)[4] = (int(*)[4])cpuName;
GetCPUInfo(*pTmp++, 0x80000002);
GetCPUInfo(*pTmp++, 0x80000003);
GetCPUInfo(*pTmp++, 0x80000004);
return 0;
}