Date: 2018.7.22
1、参考:
https://www.cnblogs.com/DxSoft/articles/5053954.html
https://blog.csdn.net/listener51/article/details/80299003
https://blog.csdn.net/sxf_zero/article/details/590171
https://blog.csdn.net/jamesliulyc/article/details/2028958
2、什么是cpuid指令
CPUID指令是intel IA32架构下获得CPU信息的汇编指令,可以得到CPU类型,型号,制造商信息,商标信息,序列号,缓存,支持特性(MMX,SSE,AVX)等一系列CPU相关的东西。
指令功能:
按照最初输入 EAX 寄存器的值,将处理器标识与功能信息返回给 EAX、EBX、ECX 及 EDX 寄存器。
3、cpuid指令的使用
cpuid使用eax作为输入参数,eax,ebx,ecx,edx作为输出参数,举个例子:
__asm
{
mov eax, 0
cpuid
}
cpuid指令返回的信息有两种,一种是基本信息,一种是扩展信息。
eax赋值为0,取得的是基本信息;eax赋值为1,取得的是扩展信息。
4、C实现获取cpuid
int get_cpu_flags(void)
{
int flags = 0;
if(cpuid_supported())
{
int info0[4];
int info1[4];
int info7[4];
int ext0[4];
int ext1[4];
char *vendor;
cpuid_ext(info0,0,0);
vendor = (char*)(info0+1);
printf("CPU Vendor:%c%c%c%c%c%c%c%c%c%c%c%c",vendor[0],vendor[1],vendor[2],vendor[3],
vendor[4],vendor[5],vendor[6],vendor[7],vendor[8],vendor[9],vendor[10],vendor[11]);
if(info0[0]>1)
{
cpuid_ext(info1,1,1);
if(info1[3] &(1<<23))
flags |= 0x0001;//MMX
if(info1[3] &(1<<25))
flags |=0x0004; //MMX_EXT
if(info1[3] &(1<<25))
flags |=0x0002; //SSE
if(info1[3] &(1<<26))
flags |=0x0008; //SSE2
if(info1[2] &1)
flags |=0x00100000; //SSE3
if(info1[2] &(0x00000200))
flags |=0x0080; //SSSE3
if(info1[2] &(0x00080000))
flags |=0x01000000; //SSE4
if(info1[2] &(0x00100000))
flags |=0x10000000; //SSE4.2
}
}
return flags;
}