Assembly 如何解释片上系统cpu供应商字符串?

Assembly 如何解释片上系统cpu供应商字符串?,assembly,x86,x86-64,cpuid,Assembly,X86,X86 64,Cpuid,英特尔手册定义了负责cpu供应商字符串的cpuidleaf0x17。输出取决于ecx中的值。因此,根据注释: 叶17H输出取决于ECX中的初始值。SOC供应商 品牌字符串是一个UTF-8编码的字符串,后面填充了 00H.完整的SOC供应商品牌字符串由 按照EAX:EBX:ECX:EDX的升序和从 亚叶1片段朝向亚叶3 我编写了以下程序集,希望得到一些合理的字符串: ;Set the System-On-Chip value to eax mov eax, 0x17 ;Set the first

英特尔手册定义了负责cpu供应商字符串的
cpuid
leaf
0x17
。输出取决于
ecx
中的值。因此,根据注释:

叶17H输出取决于
ECX
中的初始值。SOC供应商 品牌字符串是一个UTF-8编码的字符串,后面填充了 00H.完整的SOC供应商品牌字符串由 按照EAX:EBX:ECX:EDX的升序和从 亚叶1片段朝向亚叶3

我编写了以下程序集,希望得到一些合理的字符串:

;Set the System-On-Chip value to eax
mov eax, 0x17

;Set the first subleaf in ecx
mov ecx, 0x01

cpuid
cpuid
指令的结果如下:

(gdb) p/x $eax
$8 = 0x7d0
(gdb) p/x $ebx
$9 = 0xfa0
(gdb) p/x $ecx
$10 = 0x64
(gdb) p/x $edx
$11 = 0x0
简单地连接寄存器内容(丢弃尾随的
0x00
字节)不会产生可读性:

$1 = 0x7fffffffdea0 "d\240\017\320\a"

问题:如何解释SOC供应商字符串?

您的处理器不支持cpuid叶0x17。使用cpuid叶0查找支持的最大cpuid叶(在eax中返回)。例如,在我的系统上,最大cpuid叶是0x0f。当cpuid与大于支持的最大值的叶值一起使用时,处理器将返回支持的最大值的结果,这就是为什么您会得到看起来像垃圾值的结果。(如果您尝试使用cpuid叶0x16,您将看到得到与使用0x17时完全相同的返回值。)

完全相同。在我的CPU上,最大值原来是
0x16