很抱歉,如果这些都是天真的问题 - 我对C在低级别的实际工作方式知之甚少。
所以我正在生成机器代码以写入一些mmap的内存以供执行。我对使用十六进制文字生成机器代码感到困惑。
考虑汇编指令(AT& T语法):cmove %edx, %ecx
。这具有机器代码表示0x0F44CA
。
所以,会做类似的事情:
char opcode[3] { 0x0F, 0x44, 0xCA };
代表“引擎盖下”时的正确二进制字符串?我怀疑它可能不会,因为C中显然十六进制的文字存储为整数。我担心的是,由于整数是32位,所以存储的实际值是
0x0000000F 0x00000044 0x000000CA
这与我需要的完全不同。
我的另一个问题是,我给数组的类型会影响实际存储的值吗?
uint8_t opcode[3] { 0x0F, 0x44, 0xCA };
或
int opcode[3] { 0x0F, 0x44, 0xCA };
与
有所不同char opcode[3] { 0x0F, 0x44, 0xCA };
引擎盖下?
答案 0 :(得分:1)
我没有解决您的实际问题,但我认为这两点可以帮助您更好地理解机器代码。
使用objdump
,您将获得machine code
和assembly code
一起来了解正在发生的事情。
objdump -d prog.o
我希望这会对你有所帮助。
答案 1 :(得分:1)
uint8_t opcode[3] = { 0x0F, 0x44, 0xCA };
会按照您给出的顺序将值存储为8位值'bytes'。
与
相同 unsigned char opcode[3] = { 0x0F, 0x44, 0xCA };
但是使用'int'类型就像你说的那样 0000000F00000044000000CA 要么 0F00000044000000CA000000 取决于系统的结束。