【发布时间】:2010-05-11 23:51:05
【问题描述】:
我用 C 语言编写虚拟机只是为了好玩。蹩脚,我知道,但幸运的是我在 SO 所以希望没有人会取笑:)
我编写了一个非常快速的虚拟机,它可以读取(我自己的)ASM 行并执行一些操作。现在,我只有 3 条指令:add、jmp、end。一切都很好,能够提供线路实际上非常酷(像write_line(&prog[1], "jmp", regA, regB, 0); 这样做,然后运行程序:
while (machine.code_pointer <= BOUNDS && DONE != true)
{
run_line(&prog[machine.cp]);
}
我在 C 中使用操作码查找表(可能效率不高,但很优雅),一切似乎都正常。
我的问题更像是一个“最佳实践”问题,但我确实认为它有一个正确的答案。我正在使 VM 能够读取二进制文件(将字节存储在 unsigned char[] 中)并执行字节码。我的问题是:确保字节码格式正确是VM的工作还是只是编译器的工作是确保它吐出的二进制文件格式正确?
我之所以这样问,是因为如果有人编辑二进制文件并搞砸了(删除它的任意部分等)会发生什么。显然,该程序将是错误的,并且可能无法正常工作。这甚至是VM的问题吗?我敢肯定,比我聪明得多的人已经找到了解决这些问题的方法,我只是好奇它们是什么!
【问题讨论】:
标签: c assembly programming-languages vm-implementation