抱歉,如果这些都是幼稚的问题-我对C在低级阶段是如何工作的了解甚少。
所以我正在生成机器代码来写入一些mmap'd内存以供执行。我对使用十六进制文字生成机器代码感到困惑。
考虑汇编指令(AT&T语法):cmove %edx, %ecx
。它具有机器代码表示形式0x0F44CA
。
所以,你会做一些类似的事情:
char opcode[3] { 0x0F, 0x44, 0xCA };
当“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 opcode[3] = { 0x0F, 0x44, 0xCA };
将按给定的顺序将值存储为8位值“字节”。
它和unsigned char opcode[3] = { 0x0F, 0x44, 0xCA };
但是使用“int”类型就像你说的
0000000 F0000004400000加元
或
0f0000044000000ca000000号
取决于你的系统。