分享

获取CPU信息

 quasiceo 2013-11-26
分类: C/C++/MFC 2011-11-25 14:44 570人阅读 评论(1) 收藏 举报

获取CPU信息

主要是利用汇编指令 CPUID 和 RDTSC 

直接上代码:

  1. //=====================================================================================  
  2. /*                 CPUID指令是intel IA32架构下获得CPU信息的汇编指令, 
  3.                    可以得到CPU类型,型号,制造商信息,商标信息,序列号, 
  4.                    缓存等一系列CPU相关的东西。 
  5. */  
  6. #include <windows.h>  
  7. #include <iostream>  
  8. #include <string>  
  9.   
  10. using namespace std;  
  11.   
  12.   
  13. //用来存储eax,ebx,ecx,edx四个寄存器的信息  
  14. DWORD deax;  
  15. DWORD debx;  
  16. DWORD decx;  
  17. DWORD dedx;  
  18.   
  19. void ExeCPUID(DWORD veax)  //初始化CPU  
  20. {  
  21. __asm  
  22. {  
  23.     mov eax,veax  
  24.     cpuid  
  25.     mov deax,eax  
  26.     mov debx,ebx  
  27.     mov decx,ecx  
  28.     mov dedx,edx  
  29. }  
  30. }  
  31.   
  32. /*  在Intel Pentium以上级别的CPU中,有一个称为“时间戳(Time Stamp)”的部件, 
  33.     它以64位无符号整型数的格式,记录了自CPU上电以来所经过的时钟周期数。 
  34.     由于目前的CPU主频都非常高,因此这个部件可以达到纳秒级的计时精度。 
  35.     这个精确性是上述两种方法所无法比拟的。 
  36.     在Pentium以上的CPU中,提供了一条机器指令RDTSC(Read Time Stamp Counter) 
  37.     来读取这个时间戳的数字,并将其保存在EDX:EAX寄存器对中 
  38. */  
  39. long GetCPUFreq()       //获取CPU频率,单位: MHZ  
  40. {  
  41.     int start,over;  
  42.     _asm   
  43.     {  
  44.         RDTSC  
  45.         mov start,eax  
  46.     }  
  47.     Sleep(50);  
  48.     _asm   
  49.     {  
  50.         RDTSC  
  51.         mov over,eax  
  52.     }  
  53.     return (over-start)/50000;  
  54. }  
  55.   
  56.   
  57.   
  58. /*   把eax = 0作为输入参数,可以得到CPU的制造商信息。 
  59.      cpuid指令执行以后,会返回一个12字符的制造商信息, 
  60.      前四个字符的ASC码按低位到高位放在ebx,中间四个放在edx,最后四个字符放在ecx。 
  61. */  
  62. string GetManID()   //获取制造商信息  
  63. {  
  64.     char ID[25];          
  65.     memset(ID,0,sizeof(ID));  
  66.       
  67.     ExeCPUID(0);          //初始化  
  68.     memcpy(ID+0,&debx,4); //制造商信息复制到数组  
  69.     memcpy(ID+4,&dedx,4);  
  70.     memcpy(ID+8,&decx,4);  
  71.       
  72.     return string(ID);  
  73. }  
  74.   
  75.   
  76. /*  在我的电脑上点击右键,选择属性,可以在窗口的下面看到一条CPU的信息, 
  77.     这就是CPU的商标字符串。CPU的商标字符串也是通过cpuid得到的。 
  78.     由于商标的字符串很长(48个字符),所以不能在一次cpuid指令执行时全部得到, 
  79.     所以intel把它分成了3个操作,eax的输入参数分别是0x80000002,0x80000003,0x80000004, 
  80.     每次返回的16个字符,按照从低位到高位的顺序依次放在eax, ebx, ecx, edx。 
  81.     因此,可以用循环的方式,每次执行完以后保存结果,然后执行下一次cpuid。 
  82. */  
  83. string GetCPUType()  
  84. {  
  85.     const DWORD id = 0x80000002; //从0x80000002开始,到0x80000004结束  
  86.     char CPUType[49];//用来存储CPU型号信息  
  87.     memset(CPUType,0,sizeof(CPUType));//初始化数组  
  88.       
  89.     for(DWORD t = 0 ; t < 3 ; t++ )  
  90.     {  
  91.         ExeCPUID(id+t);  
  92.         //每次循环结束,保存信息到数组  
  93.         memcpy(CPUType+16*t+ 0,&deax,4);  
  94.         memcpy(CPUType+16*t+ 4,&debx,4);  
  95.         memcpy(CPUType+16*t+ 8,&decx,4);  
  96.         memcpy(CPUType+16*t+12,&dedx,4);  
  97.     }  
  98.       
  99.     return string(CPUType);  
  100. }  
  101.   
  102. void main()   
  103. {   
  104.     cout<<"本机CPU信息如下:"<<endl;  
  105.     cout<<"CPU 主 频: "<<GetCPUFreq()<<" MHZ"<<endl;  
  106.     cout<<"CPU 制造商: "<<GetManID()<<endl;  
  107.     cout<<"CPU 型 号: "<<GetCPUType()<<endl;  
  108.     cin.get();  
  109.   

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多