我有一个基于16位寄存器的虚拟机,我想知道将它编译为实际x86机器代码的步骤是什么?我不打算做一个JIT编译器除非有必要能够将编译的代码链接到另一个可执行文件/ DLL。如何将VM特定的代码编译为x86机器代码?
虚拟机的制作使得如果将虚拟机添加到项目中,可以添加特殊的语言结构。 (例如,如果将其嵌入到游戏引擎中,则可能会添加“实体”对象类型,并且可能会暴露引擎中的几个C函数)。这会导致代码完全依赖某些暴露的C函数或暴露的C++类,在它嵌入的应用程序中。
如果脚本代码是从VM字节码编译为本地EXE,这种“链接”将会如何?
它也是基于寄存器的,就像Lua的VM一样,因为所有的基本变量都存储在一个巨大的C数组中。当范围更改时,寄存器指针会递增或递减,因此寄存器编号是相对的,与堆栈指针类似。例如: -
int a = 5;
{
int a = 1;
}
可能是,在虚拟机伪汇编:
mov_int (%r0, $5)
; new scope, the "register pointer" is then incremented by the number
; of bytes that are used to store local variables in this new scope. E.g. int = 4 bytes
; say $rp is the "register pointer"
add (%rp, $4) ; since size of int is usually 4 bytes
; this is if registers are 1 bytes in size, if they were
; 4 bytes in size it would just be adding $1
mov_int (%r0, $1) ; now each register "index" is offset by 4,
; this is now technically setting %r4
; different instructions are used to get values above current scope
sub (%rp, $4) ; end of scope so reset %rp
我对这个部分的问题是,我将不得不使用堆栈指针这样的事情?基地指针?我可以用什么来取代这个概念?
您的问题对于问答网站来说太广泛了。你需要一本书或大学课程。 – EJP
我把它简化得不那么宽泛,而且更清晰,因此可以归结为两个简单的问题。 – Accumulator
我想你在这里有一些实际的可回答的问题,但我发现很难理解你问的是什么。我想帮助你,但是如果你可以试着重新解释一下这个问题,那么这真的会帮助我......) – Cauterite