CPUID为英特尔处理器返回“GenuntellineI”

时间:2015-07-21 11:49:12

标签: c++ intel processor cpuid

我正在尝试打印出一个打印出CPU名称/供应商的功能,但是当我尝试它时,我最终得到了“GenuntellineI”。

这是功能:

void PrintProcessingDeviceType()
{
    uint32_t regs[4];

    #ifdef _WIN32
    __cpuid((int*)regs, 0);
    #else
    asm volatile ("cpuid" : "=a" (regs[0]), "=b" (regs[1]), "=c" (regs[2]), "=d" (regs[3]) : "a" (0), "c" (0));
    #endif

    std::cout << std::string((const char*)&regs, 16) << std::endl;
}

两个路径(定义_WIN32,不定义)导致发生此错误。这是CPUID的问题,只是不正确,我做错了什么,或者是什么?

3 个答案:

答案 0 :(得分:4)

为什么你会期待不同的东西呢? 当指令的行为与您的预期不同时,请参阅“英特尔手册”。

CPUID with EAX=0 results

答案 1 :(得分:3)

这似乎是CPUID函数的一个怪癖,有关详细信息,请参阅http://www.microbe.cz/docs/CPUID.pdf(第2.1.1节)。 (对于 quirk 的宽松定义;它没有标记为这样,但容易被忽视。)

它返回寄存器EBX中的前4个字节,EDX中的后4个字节以及ECX中的最后4个字节。请注意两件事:首先,EAX(regs[0])的结果不包含模型名称的任何字符,因此您只应从regs[1]开始打印它。其次,最后两个寄存器的顺序是“反转”。如果交换数组的相应条目,则应获得正确的字符串(即regs[2]regs[3])。

答案 2 :(得分:1)

您可以将CPUID指令视为一个函数,它将通过EAX寄存器传递的参数值即。 CPUID返回的内容完全取决于执行CPUID之前EAX中的内容。

在执行CPUID之前的情况下,您的EAX等于0.这样,CPUID将返回计算机上GenuinIntel的基本处理器信息。 AMD处理器将在同一场景中返回AuthenticAMD

由于每个处理器略有不同,CPUID的行为取决于您的CPU,因此在获取基本CPU信息后,您必须使用CPUID的特定功能来了解有关CPU功能的更多信息等。为此您需要特定的CPU文档描述CPUID。

anderas 已经为您提供了英特尔的CPUID pdf。在这里你可以获得AMD:

http://support.amd.com/TechDocs/25481.pdf#search=cpuid