【发布时间】:2017-03-02 00:10:51
【问题描述】:
我有一个基于寄存器的 16 位虚拟机,我想知道将它编译成实际的 x86 机器代码的步骤是什么?我不打算制作 JIT 编译器除非必须能够将编译后的代码与另一个可执行文件/DLL 链接。
制作虚拟机时,如果将虚拟机添加到项目中,则可以添加特殊的语言结构。 (例如,如果它嵌入到游戏引擎中,可能会添加“实体”对象类型,并且可能会暴露引擎中的几个 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
我关于这部分的问题是,我必须使用堆栈指针来处理这种事情吗?基指针?我可以用什么来代替这个概念?
【问题讨论】:
-
您的问题对于问答网站来说太宽泛了。你需要一本书,或者一门大学课程。
-
我让它变得不那么宽泛,更清晰,所以它归结为两个简单的问题。
-
我认为你在这里有一些实际可以回答的问题,但我发现很难理解你在问什么。我想帮助你,但如果你能试着重新表述一下这个问题,那真的会……帮助我帮助你;)
-
@Cauterite 希望现在更清楚了。特别是关于寄存器指针的部分。
标签: compiler-construction virtual-machine executable jit machine-code