2

我尝试使用 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);  
}
4

2 回答 2

2

Linux 内核源代码展示了如何使用内联汇编执行 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 是输入,而所有四个都是输出),你就可以轻松地分解调用者中的各个位/字节。

于 2010-03-10T21:11:03.300 回答
0

我不明白你为什么不使用提供的功能

于 2010-03-10T21:22:22.917 回答