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++ 字转字节的主要内容,如果未能解决你的问题,请参考以下文章

python2.7 怎样将中文字符串转为字节流?

gis中栅格表面的视点分析怎么没有

c++如何获取字节BYTE的长度?

从 c++ 到 c# 的 pinvoke 字节数组

c++接收数据的时候,需要把网络字节序转成主机字节序吗

从 C++ 将字节数组传递给 lua 脚本方法