目录
经测试以前采用汇编的方法,执行完cpuid后ebx寄存器返回的值不唯一
使用下面的方法获取cpu_id
QString cpu_id;
QProcess p;
p.start("wmic cpu get ProcessorID");
p.waitForFinished();
cpu_id = QString::fromLocal8Bit(p.readAllStandardOutput());
cpu_id = cpu_id.remove("ProcessorId").trimmed();
qDebug()<<"cpu_id:"<<cpu_id;
----------------------------------------------------
1 获取cpuid
__asm__ __volatile__ (
"movl %%eax, %%edi\n"
"xorl %%ebx, %%ebx\n"
"xorl %%ecx, %%ecx\n"
"xorl %%edx, %%edx\n"
"cpuid\n"
"movl %%edx, (%%esi)\n"
"movl %%ecx, 4(%%esi)\n"
"movl %%ebx, 8(%%esi)\n"
"movl %%eax, 12(%%esi)\n"
: "=d"(s[0]), "=b"(s[1]),"=c"(s[2]),"=a"(s[3])
: "a"(0x1), "c" (0),"d"(0), "S"(s)
);
2 cpuid
执行cpuid指令后,返回值寄存器(eax、ebx、ecx、edx)的值会被更新,这些值可以被存储到内存中或进一步处理。具体来说,执行cpuid指令后,寄存器的值将被更新为以下值:
- ebx寄存器:包含CPUID的第二个返回值。
- ecx寄存器:包含CPUID的第三个返回值。
- edx寄存器:包含CPUID的第四个返回值。
- eax寄存器:包含CPUID的第一个返回值,通常包含处理器型号和厂商信息。
这些寄存器的值可以被存储到内存中或进一步处理,例如通过循环来遍历所有可用的CPUID值,或者通过cmp指令来比较不同的CPUID值。
3 注释
这段汇编代码使用了GCC的内联汇编语法,实现了执行CPUID指令并将结果存储在数组s中的功能。
具体来说,代码执行了以下操作:
- 将寄存器%eax的值存储到%edi中,这一步似乎没有实际意义,因为%edi通常被用于函数调用中的参数。
- 将寄存器%ebx、%ecx和%edx清零。
- 执行CPUID指令,获取CPU的ID信息,并将结果分别存储在寄存器%edx、%ecx、%ebx和%eax中。
- 将寄存器%edx的值存储到数组s的第1个元素中,将寄存器%ecx的值存储到数组s的第2个元素中,将寄存器%ebx的值存储到数组s的第3个元素中,将寄存器%eax的值存储到数组s的第4个元素中。
- a,b,c,d分别对应eax寄存器ebx寄存器ecx寄存器edx寄存器
- "a"(0x1)表示输入 "=a"(s[3])表示输出
上面的代码是QT 5.12 mingw 编译器
QT 5.7 msvc 编译器可直接运行下面的汇编
__asm{
mov eax,01h
xor edx,edx
cpuid
mov s[0],edx
mov s[1],eax
}