c - 从 C 生成机器代码

标签 c compiler-construction hex jit machine-code

抱歉,如果这些问题很幼稚——我对 C 在底层的工作原理知之甚少。

所以我正在生成机器代码以写入一些 mmap 内存以供执行。我对使用十六进制文字生成机器代码感到困惑。

考虑汇编指令(AT&T 语法):cmove %edx, %ecx。这具有机器代码表示 0x0F44CA

所以,会做这样的事情:

char opcode[3] { 0x0F, 0x44, 0xCA };

在 when 'under the hood' 下表示正确的二进制字符串?我怀疑它可能不会,因为显然 C 中的十六进制文字存储为整数。我担心的是,由于整数是 32 位的,因此存储的实际值是

0x0000000F 0x00000044 0x000000CA

这与我需要的完全不同。

我担心的另一个问题是,我赋予数组的类型会影响实际存储的值吗?也是

uint8_t opcode[3] { 0x0F, 0x44, 0xCA };

int opcode[3] { 0x0F, 0x44, 0xCA };

有什么不同

char opcode[3] { 0x0F, 0x44, 0xCA };

引擎盖下?

最佳答案

uint8_t 操作码[3] = { 0x0F, 0x44, 0xCA };

将按照您给定的顺序将您的值存储为 8 位值“字节”。

同理

unsigned char 操作码[3] = { 0x0F, 0x44, 0xCA };

但是如您所说,使用“int”类型 0000000F00000044000000CA 或者 0F00000044000000CA000000 取决于您系统的字节顺序。

关于c - 从 C 生成机器代码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18333487/

相关文章:

c - 如何将 8 字节十六进制枚举值添加到 unsigned char 指针?

c# - C# 编译器如何区分抽象方法的具体子类实现和抽象基类中的重载?

Java 编译器 run() 方法

Java 将 Int 转换为 Hex 并将其粘贴到字节数组元素中

RHEL 5 libudev.h 中的编译错误 No such file or directory

c - C的类ORM库

c - Essentia Music Extractor命令行程序的参数

CMake 子目录库和主项目

c - GCC 是否为传递给函数的数组创建 typedef?

c++ - 十六进制值转 ASCII