0

我正在尝试获得一个打印出 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 不正确的问题,是我做错了什么,还是什么?

4

3 回答 3

4

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

EAX=0 结果的 CPUID

于 2015-07-22T08:24:15.693 回答
3

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

它返回寄存器 EBX 中的前 4 个字节,EDX 中的后 4 个字节和 ECX 中的最后一个字节。注意两点:首先,EAX( regs[0]) 的结果不包含模型名称的任何字符,所以你应该只打印它从 开始regs[1]。其次,最后两个寄存器的顺序是“颠倒的”。如果您交换数组的各个条目,您应该得到正确的字符串(即regs[2]regs[3])。

于 2015-07-21T12:03:48.377 回答
1

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

在您的情况下,在执行 CPUID 之前,您的 EAX 等于 0。这样 CPUID 会返回GenuinIntel您机器上的基本处理器信息。AMD 处理器将AuthenticAMD在相同的情况下返回。

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

安德拉斯已经为您提供了英特尔的 CPUID pdf。在这里你可以得到 AMD:

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

于 2015-07-21T12:31:39.080 回答