C++ 字到字节

标签 c++ assembly cpuid

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

最佳答案

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 是输入,而所有四个都是输出),您可以轻松地分解调用方中的各个位/字节。

关于C++ 字到字节,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2420554/

相关文章:

c++ - 如何从基类(非抽象类)调用重载函数?

linux - 为什么这个简单的汇编程序适用于 AT&T 语法而不是 Intel 语法?

c - GCC 内联汇编操作所有寄存器?

c - 64 位内核不支持带有 .code64 汇编程序的 IA-32 应用程序吗?

multithreading - 对于 Mac 和 BSD,如何找到当前线程运行的 cpu?

c++ - 在 C++ 中将一个 int 打包到一个位域中

c++ - 对 std/boost 移动的模糊调用

c++ - Visual Studio 2012 - 在单独的文件中使用 OpenGL(GLU、GLUT)的删除功能

c# - 在虚拟机上获取 CPU ID

c++ - 如何在选择错误选项时保持程序运行而不退出?