我正在尝试打印出一个打印出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*)®s, 16) << std::endl;
}
两个路径(定义_WIN32,不定义)导致发生此错误。这是CPUID的问题,只是不正确,我做错了什么,或者是什么?
答案 0 :(得分:4)
为什么你会期待不同的东西呢? 当指令的行为与您的预期不同时,请参阅“英特尔手册”。
答案 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: