的即时编译目前,我们正在对我们自己的Java虚拟机实现的JIT编译的一部分。现在我们的想法是将给定的Java字节码简单地转换为操作码,将它们写入可执行的内存并调用到方法的开头。Java字节码
假设给定的Java代码如下:
int a = 13372338;
int b = 32 * a;
return b;
现在,下面的方法被提出(假设给定的存储器位于0x1000 &开始返回值在EAX预期):
0x1000: first local variable - accessible via [eip - 8]
0x1004: second local variable - accessible via [eip - 4]
0x1008: start of the code - accessible via [eip]
Java bytecode | Assembler code (NASM syntax)
--------------|------------------------------------------------------------------
| // start
| mov edx, eip
| push ebx
|
| // method content
ldc | mov eax, 13372338
| push eax
istore_0 | pop eax
| mov [edx - 8], eax
bipush | push 32
iload_0 | mov eax, [edx - 8]
| push eax
imul | pop ebx
| pop eax
| mul ebx
| push eax
istore_1 | pop eax
| mov [edx - 4], eax
iload_1 | mov eax, [edx - 4]
| push eax
ireturn | pop eax
|
| // end
| pop ebx
| ret
这就像虚拟机本身一样使用堆栈。 有关此解决方案的问题是:
- 这种编译方法是否可行?
- 它甚至有可能实现所有的Java指令这样?像athrow/instanceof和类似的命令怎么能被翻译?
这与C++有什么关系? –
那么虚拟机,因此实际编译和生成的方法的调用是用C++实现的,可能不是最相关的标记,但也很重要。 – maxdev
您发布的代码都不是C++。您正在询问如何在汇编中实现Java字节码。 –