为x86的子集实现模拟器

时间:2012-02-17 20:15:35

标签: c++ x86 simulation

我希望为x86架构的指令子集实现一个模拟器。给定二进制文件,我希望对其进行反汇编并对指令进行模拟。为此,需要查看指令的某些位以确定它是控制指令,算术指令还是逻辑指令,并且基于此,必须通过查看剩余位来获得操作的参数。实现这一点的一个显而易见但痛苦的方法是使用嵌套的if-else / switch-case语句。有人可以提出更好的方法来实现这个吗?

3 个答案:

答案 0 :(得分:3)

使用查找表,可能采用std::map

的形式

答案 1 :(得分:1)

如果缓存转换的输出,那么执行嵌套的if / else类型构造应该没问题。如果您正在进行模拟,则程序中的所有静态指令中的动态指令相对较少。因此,最佳性能优化是缓存转换的输出,然后在动态指令执行时重用它。最终您的缓存将填满,您需要清除它以获取新条目。但是以某种方式缓存翻译更有意义,而不是试图提出一种非常快速的翻译方法。

作为示例,QEMU是一个模拟器,支持针对性能进行了优化的各种目标。你可以在这里看到他们如何翻译x86指令:

https://github.com/qemu/QEMU/blob/master/target-i386/translate.c#L4076

如果QEMU为每条指令执行此操作,性能将非常慢。但是,由于缓存结果并不重要,因为第一次翻译指令时会出现复杂的案例陈述。

答案 2 :(得分:1)

你可以查看x86模拟器的来源,找到这个想法的实现,已经完全编写和充实。

您可以尝试以下方法:http://www.dosbox.com/wiki/BuildingDOSBox#1._Grab_the_source

如果这不成功,请告诉我;有很多可供选择。

一般来说,使用模拟器,我认为操作码的开关是一种方法。另一个好的方法是256条函数指针数组,对应于指令的第一个字节。这比巨型开关或块块提供了更多的分离。当然,您可以根据需要重用这些功能。