我想使用 C++ 获取我的计算机(Windows)的 CPU Id。
我使用此代码来获取它。
它输出如下信息:
For InfoType 0
CPUInfo[0] = 0x5
CPUInfo[1] = 0x756e6547
CPUInfo[2] = 0x6c65746e
CPUInfo[3] = 0x49656e69
For InfoType 1
CPUInfo[0] = 0xf31
CPUInfo[1] = 0x20800
CPUInfo[2] = 0x41d
CPUInfo[3] = 0xbfebfbff
For InfoType 2
CPUInfo[0] = 0x605b5001
CPUInfo[1] = 0x0
CPUInfo[2] = 0x0
CPUInfo[3] = 0x7c7040
For InfoType 3
CPUInfo[0] = 0x0
CPUInfo[1] = 0x0
CPUInfo[2] = 0x0
CPUInfo[3] = 0x0
For InfoType 4
CPUInfo[0] = 0x0
CPUInfo[1] = 0x0
CPUInfo[2] = 0x0
CPUInfo[3] = 0x0
For InfoType 5
CPUInfo[0] = 0x40
CPUInfo[1] = 0x40
CPUInfo[2] = 0x0
CPUInfo[3] = 0x0
For InfoType 80000000
CPUInfo[0] = 0x80000008
CPUInfo[1] = 0x0
CPUInfo[2] = 0x0
CPUInfo[3] = 0x0
For InfoType 80000001
CPUInfo[0] = 0x0
CPUInfo[1] = 0x0
CPUInfo[2] = 0x0
CPUInfo[3] = 0x0
For InfoType 80000002
CPUInfo[0] = 0x20202020
CPUInfo[1] = 0x20202020
CPUInfo[2] = 0x20202020
CPUInfo[3] = 0x20202020
For InfoType 80000003
CPUInfo[0] = 0x47202020
CPUInfo[1] = 0x69756e65
CPUInfo[2] = 0x4920656e
CPUInfo[3] = 0x6c65746e
For InfoType 80000004
CPUInfo[0] = 0x20295228
CPUInfo[1] = 0x20555043
CPUInfo[2] = 0x30382e32
CPUInfo[3] = 0x7a4847
For InfoType 80000005
CPUInfo[0] = 0x0
CPUInfo[1] = 0x0
CPUInfo[2] = 0x0
CPUInfo[3] = 0x0
For InfoType 80000006
CPUInfo[0] = 0x0
CPUInfo[1] = 0x0
CPUInfo[2] = 0x4008040
CPUInfo[3] = 0x0
For InfoType 80000007
CPUInfo[0] = 0x0
CPUInfo[1] = 0x0
CPUInfo[2] = 0x0
CPUInfo[3] = 0x0
For InfoType 80000008
CPUInfo[0] = 0x2028
CPUInfo[1] = 0x0
CPUInfo[2] = 0x0
CPUInfo[3] = 0x0
Run Code Online (Sandbox Code Playgroud)
我无法理解这些信息中哪些是我的计算机唯一的 CPU Id。
任何人都可以帮助我解决这个问题。
您的意思是“序列号”、“谁制造了处理器”还是“标识处理器品牌和型号的字符串”。
序列号:
除非您有 Pentium III,否则您没有与 CPU 相关联的“唯一 ID”。
Intel 在 P3 中引入了唯一 id(序列号)指令。但在隐私问题引起轩然大波之后,他们很快在随后的 CPU 版本中禁用了该功能。
作为记录,在汇编中执行此功能的指令:
mov eax, 3
cpuid
Run Code Online (Sandbox Code Playgroud)
处理器序列号是 eax、edx 和 ecx 的串联
您可以通过将“3”作为第二个参数传递给 __cpuid 函数来实现相同的功能。但除非您有 P3,否则它将无法工作或返回序列号。
供应商(制造处理器的人)
int regs[4] = {0};
char vendor[13];
__cpuid(regs, 0); // mov eax,0; cpuid
memcpy(vendor, ®s[1], 4); // copy EBX
memcpy(vendor+4, ®s[3], 4); // copy EDX
memcpy(vendor+8, ®s[2], 4); // copy ECX
vendor[12] = '\0';
print("My CPU is a %s\n", vendor);
Run Code Online (Sandbox Code Playgroud)
在您的情况下,这应该打印“GenuineIntel”。
品牌和型号(品牌字符串)
如果您想要 CPUID 指令的所有详细信息,包括如何获取 CPU 的品牌、型号和步进,以及“品牌字符串”,例如“Intel(R) Core (TM)i7-3770 CPU @ 3.4GHZ ....”您可以在下面的链接中参考英特尔手册。向下滚动文档以查找 CPUID 的文档。我懒得给你打字了。
MSVC 编译器提供的 __cpuid() 指令在调用 cpuid 指令之前将“InfoType”映射到 EAX。在该指令返回后,EAX、EBX、ECX 和 EDX 被复制到您传递给该函数的 CPUInfo[4] 数组中。