9

在为 Windows 编写新代码时,我偶然发现_cpuinfo()了 Windows API。因为我主要处理 Linux 环境 (GCC),所以我想访问 CPUInfo。

我尝试了以下方法:

#include <iostream>
 
int main()
{
  int a, b;
 
  for (a = 0; a < 5; a++)
  {
    __asm ( "mov %1, %%eax; "            // a into eax
          "cpuid;"
          "mov %%eax, %0;"             // eax into b
          :"=r"(b)                     // output
          :"r"(a)                      // input
          :"%eax","%ebx","%ecx","%edx" // clobbered register
         );
    std::cout << "The CPUID level " << a << " gives EAX= " << b << '\n';
  }
 
  return 0;
}

这个使用程序集,但我不想重新发明轮子。有没有其他方法可以在不组装的情况下实现 CPUInfo?

4

2 回答 2

38

由于您正在使用 GCC 进行编译,因此您可以包含cpuid.h声明这些函数的哪个:

/* Return highest supported input value for cpuid instruction.  ext can
   be either 0x0 or 0x8000000 to return highest supported value for
   basic or extended cpuid information.  Function returns 0 if cpuid
   is not supported or whatever cpuid returns in eax register.  If sig
   pointer is non-null, then first four bytes of the signature
   (as found in ebx register) are returned in location pointed by sig.  */
unsigned int __get_cpuid_max (unsigned int __ext, unsigned int *__sig)

/* Return cpuid data for requested cpuid level, as found in returned
   eax, ebx, ecx and edx registers.  The function checks if cpuid is
   supported and returns 1 for valid cpuid information or 0 for
   unsupported cpuid level.  All pointers are required to be non-null.  */
int __get_cpuid (unsigned int __level,
    unsigned int *__eax, unsigned int *__ebx,
    unsigned int *__ecx, unsigned int *__edx)

您不需要也不应该重新实现此功能。

于 2013-01-10T20:44:07.717 回答
8
for (a =0; a < 5; ++a;)

那里应该只有两个分号。你有三个。

这是基本的 C/C++ 语法;CPUID 是一个红鲱鱼。

于 2013-01-10T20:45:33.850 回答