0

对不起,如果这些是幼稚的问题 - 我对 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 };

在引擎盖下?

4

2 回答 2

1

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

  1. 使用objdump,您将聚machine code在一起assembly code 了解正在发生的事情。

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

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

于 2013-08-20T11:36:52.893 回答
1

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

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

它与

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

但是使用'int'类型就像你说的 0000000F00000044000000CA 或 0F00000044000000CA000000 取决于你的系统的字节序。

于 2013-08-20T12:59:06.697 回答