📄 get_cpu_64flag.cpp
字号:
#define FLAG_IA64 1 // Intel IA64
#define FlAG_EM64T 2 // Intel EM64T
#define FLAG_INTELCPU_NOT64 3 //Intel IA32
#define FLAG_AMD 4 //AMD CPU: unsupported
#define FLAG_Cyrix 5 //Cyrix CPU: unsupported
#define FLAG_UNKNOWNCPU 6 //unknown vendor CPU: unsupported
#define FLAG_NOCPUID_SUPPORT 7 //cpu not support for cpuid instruction,早期的8086 286 386等,Intel从486开始支持
// or not support the input of cpuid (eax = 1; eax = 80000001h)
#include "stdio.h"
#include "string.h"
int get_cpu_64Flag()
{
int em64t_mask = 0x20000000;
int ia64_mask = 0x40000000;
char vendor_id[13] = {0};
__asm{
;//judge support of CPUID
pushfd ; save EFLAGS
pop eax ; store EFLAGS in EAX
mov ebx, eax ; save in EBX for later testing
xor eax, 00200000h ; toggle bit 21
push eax ; push to stack
popfd ; save changed EAX to EFLAGS
pushfd ; push EFLAGS to TOS
pop eax ; store EFLAGS in EAX
cmp eax, ebx ; see if bit 21 has changed
jz NO_CPUID ; if no change, no CPUID
;//get vendor_id
mov eax, 0
_EMIT 0fh ;//CPUID
_EMIT 0a2h
mov dword ptr [vendor_id], EBX
mov dword ptr [vendor_id + 4], EDX
mov dword ptr [vendor_id + 8], ECX
;//cmp for "GenuineIntel"
cmp ebx, 756E6547H ;'Genu'
jne NOT_INTEL
cmp edx, 49656E69H ;'ineI'
jne NOT_INTEL
cmp ecx, 6C65746EH ;'ntel'
jne NOT_INTEL
cmp eax, 1 ;make sure 1 is valid input for CPUID
jl NO_CPUID
;//get ia64_mask
mov eax, 1
_EMIT 0fh ;//CPUID
_EMIT 0a2h
and edx, ia64_mask
cmp edx, ia64_mask
je IA64
;//get em64t_mask
mov eax, 80000000h
_EMIT 0fh ;//CPUID
_EMIT 0a2h
cmp eax,80000001h; make sure 80000001h is valid input for CPUID
jl NO_CPUID
mov eax, 80000001h
_EMIT 0fh ;//CPUID
_EMIT 0a2h
and edx, em64t_mask
cmp edx, em64t_mask
je EM64T
}
return FLAG_INTELCPU_NOT64;
NO_CPUID:
return FLAG_NOCPUID_SUPPORT;
NOT_INTEL:
if (0 == strcmp(vendor_id,"CyrixInstead"))
return FLAG_Cyrix;
else if (0 == strcmp(vendor_id,"AuthenticAMD"))
return FLAG_AMD;
else return FLAG_UNKNOWNCPU;
IA64:
return FLAG_IA64;
EM64T:
return FlAG_EM64T;
}
int main()
{
int flag = 0;
flag = get_cpu_64Flag();
switch(flag){
case FlAG_EM64T:
printf("Intel EM64T \n");
break;
case FLAG_IA64:
printf("Intel IA64 \n");
break;
case FLAG_INTELCPU_NOT64:
printf("Intel CPU: not IA64 or EM64T, possiable IA32 \n");
break;
case FLAG_Cyrix:
printf("it is a Cyrix CPU, unsupported \n");
break;
case FLAG_AMD:
printf("it is a AMD CPU, unsupported \n");
break;
case FLAG_UNKNOWNCPU:
printf("unknown cpu vendor: not Intel or AMD or Cyrix. unsupported \n");
break;
case FLAG_NOCPUID_SUPPORT:
printf("no cpuid support, can't get the cpu info \n");
break;
default:
printf("return error %d \n",flag);
}
getchar();
return 0;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -