我尝试在C ++中使用汇编程序读取CPUID。我知道它有功能,但我想要asm方式。因此,在执行CPUID之后,它应该用ASCII编码的字符串填充eax,ebx,ecx寄存器。但我的问题是,因为我可以在asm地址只有完整或半个eax寄存器,如何将32位分成4个字节。我用过这个:
#include <iostream>
#include <stdlib.h>
int main()
{
_asm
{
cpuid
/*There I need to mov values from eax,ebx and ecx to some propriate variables*/
}
system("PAUSE");
return(0);
}
答案 0 :(得分:2)
Linux内核源shows how使用内联汇编执行x86 cpuid。语法是GCC特定的;如果你在Windows上,这可能没有帮助。
static inline void native_cpuid(unsigned int *eax, unsigned int *ebx,
unsigned int *ecx, unsigned int *edx)
{
/* ecx is often an input as well as an output. */
asm volatile("cpuid"
: "=a" (*eax),
"=b" (*ebx),
"=c" (*ecx),
"=d" (*edx)
: "0" (*eax), "2" (*ecx));
}
一旦你有这种格式的函数(注意EAX,ECX是输入,而所有四个都是输出),你可以轻松地打破调用者中的各个位/字节。
答案 1 :(得分:0)
我不明白你为什么不使用提供的功能
以真人的方式链接real assembly code; - )
或使用common way