抱歉,如果这些问题很幼稚——我对 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/