C++ 字转字节
Posted
技术标签:
【中文标题】C++ 字转字节【英文标题】:C++ word to bytes 【发布时间】:2010-03-10 21:02:25 【问题描述】:我尝试使用 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);
【问题讨论】:
这个问题可能被误读为“如何在不学习汇编的情况下进行汇编编程?”根据您的要求。显而易见的答案是让您了解如何为您喜欢的环境(Visual C++、x86 Linux 上的 GCC 等)执行 x86 内联汇编。 为什么?实际上,我比 C 更了解汇编。这个 _asm 实现在 Visual C++ 中运行良好。我只是不知道如何使用 C++ 将这 4 个字节分成 4 个字符。 【参考方案1】: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 是输入,而所有四个都是输出),你就可以轻松地分解调用者中的各个位/字节。
【讨论】:
【参考方案2】:我不明白你为什么不使用提供的功能
任一链接real assembly code 真正的男人的路;-)
或使用common way
【讨论】:
因为我喜欢自己写简单的函数:) 我也是,您查看了第一个链接并查看了其中的内容吗? 当然有。但我担心这对我来说太多了,现在无法处理。你知道,我在 8051 兼容的 CPU 上学习了基本的 asm,所以 x86 是一个挑战。但是,你能告诉我一件事吗?当我将内联 asm 写入 C 代码时,没有预处理器指令,我相信它都是由 C 代码设置的,对吧?你知道,我是游戏新手 :)以上是关于C++ 字转字节的主要内容,如果未能解决你的问题,请参考以下文章