JIT代码生成技术

HS.*_*HS. 19 interpreter jit .net-assembly

虚拟机如何动态生成本机代码并执行它?

假设您可以确定要发出的本机机器操作码是什么,那么您如何实际运行它?

将助记符指令映射到二进制代码,将其填充到char*指针并将其作为函数进行转换并执行是不是很麻烦?

或者你会生成一个临时共享库(.dll或.so或其他)并使用标准函数将其加载到内存中LoadLibrary吗?

Chr*_*ies 8

您只需使程序计数器指向您要执行的代码即可.请记住,数据可以是数据或代码.在x86上,程序计数器是EIP寄存器.EIP的IP部分代表指令指针.调用JMP指令跳转到地址.跳转后EIP将包含此地址.

将助记符指令映射到二进制代码,将其填充到char*指针并将其作为函数进行转换并执行是不是很麻烦?

是.这是一种方法.生成的代码将转换为指向 C 函数指针.


小智 6

将助记符指令映射到二进制代码,将其填充到char*指针并将其作为函数进行转换并执行是不是很麻烦?

是的,如果你是用C或C++(或类似的东西)做的,那正是你要做的.

看起来很酷,但这实际上是语言设计的一件神器.请记住,您要使用的实际算法非常简单:确定要使用的指令,将它们加载到内存中的缓冲区中,然后跳转到该缓冲区的开头.

但是,如果您确实尝试这样做,请确保在返回C程序时获得正确的调用约定.我想如果我想生成代码,我会寻找一个库来为我处理这个方面.Nanojit最近出现在新闻中; 你可以看一下.