2

我正在阅读一篇关于如何构建Jit Compiler的文章,作者基本上使用了这段代码:

// Processor instructions for:
//   mov eax, 0   
//   ret 
unsigned char code[] = {0xb8, 0x00, 0x00, 0x00, 0x00, 0xc3};

void *mem = mmap(NULL, sizeof(code), PROT_WRITE | PROT_EXEC,
    MAP_ANON | MAP_PRIVATE, -1, 0);  

memcpy(mem, code, sizeof(code));

int (*func)() = mem;   
return func();

我得到了关于代码的所有信息,除了他如何知道如何手动将汇编指令映射到数字代码。我需要学习什么才能理解这一点?

4

3 回答 3

4

有一些参考资料(例如 Intel 64 和 IA-32的参考资料)涵盖了汇编指令如何映射到实际的机器代码。这当然会在 CPU/环境之间进行 - 例如,上述内容不适用于 ARM 系统。

或者,可以从现有生成的输出中复制这些值,例如从汇编器的输出中复制这些值。

于 2013-10-16T02:51:06.840 回答
3

我是文章作者,希望你喜欢!

为了构建这些价值观,我基本上做了

$ cat test.S
  .intel_syntax noprefix
  mov eax, 0
  ret
$ gcc -c -o test.o test.S
$ objdump -d -M intel test.o

test.o:     file format elf64-x86-64


Disassembly of section .text:

0000000000000000 <.text>:
   0:   b8 00 00 00 00          mov    eax,0x0
   5:   c3                      ret

您可以在左列中看到指令的字节。除非您有充分的理由,否则我不建议您深入研究指令编码。它们非常复杂,而汇编程序非常擅长生成这些东西。在这个级别还有很多其他的东西要学习,可以更好地利用你的大脑能量。阅读Agner Fog 的手册以获得良好的开端。

于 2013-10-16T05:35:00.477 回答
1

您可以使用许多库来编写 JIT。AsmJit将帮助您发出机器代码指令(在 x86 上)。GNU LightninglibjitLLVM会将一些抽象指令集(或抽象语法树)翻译成机器码。

处理器指令集体系结构已记录(在冗长无聊的文档中)。对于x86,您可能需要阅读数千页。

于 2013-10-16T05:15:58.267 回答