从C生成机器代码

时间:2013-08-20 11:09:15

标签: c compiler-construction hex jit machine-code

很抱歉,如果这些都是天真的问题 - 我对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 };
引擎盖下?

2 个答案:

答案 0 :(得分:1)

我没有解决您的实际问题,但我认为这两点可以帮助您更好地理解机器代码。

  1. 使用objdump,您将获得machine codeassembly code 一起来了解正在发生的事情。

    objdump -d prog.o
    
  2. 阅读这篇文章http://csapp.cs.cmu.edu/public/ch3-preview.pdf

  3. 我希望这会对你有所帮助。

答案 1 :(得分:1)

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

会按照您给出的顺序将值存储为8位值'bytes'。

相同

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

但是使用'int'类型就像你说的那样 0000000F00000044000000CA 要么 0F00000044000000CA000000 取决于系统的结束。