C++字到字节

发布于 2024-08-24 20:06:12 字数 381 浏览 9 评论 0原文

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

I tried to read CPUID using assembler in C++. I know there is function for it in , but I want the asm way. So, after CPUID is executed, it should fill eax,ebx,ecx registers with ASCII coded string. But my problem is, since I can in asm adress only full, or half eax register, how to break that 32 bits into 4 bytes. I used this:

#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);  
}

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

南笙 2024-08-31 20:06:12

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

The Linux kernel source shows how to execute x86 cpuid using inline assembly. The syntax is GCC specific; if you're on Windows this probably isn't helpful.

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));
}

Once you have a function in this format (note that EAX, ECX are inputs, while all four are outputs), you can easily break out the individual bits/bytes in the caller.

别在捏我脸啦 2024-08-31 20:06:12

我不明白为什么你不使用提供的函数

I don't understand why you don't use the provided function anyway

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文