2

我有一种用于 x86 汇编指令的模拟器,但问题是它不接受完整的指令集。例如,如果给定一个 INT 命令,它将终止。可以在模拟器上运行命令的所有二进制表示(8 位、16 位和 32 位),并查看哪些是有效的,哪些是无效的。

它用于遗传编程,需要改变命令二进制表示,但试图在不创建无效命令的情况下执行此操作。

最简单的解决方案似乎只是计算它们,但是原始指令集和较小指令集之间的转换函数将如何工作?

4

1 回答 1

3

如果代码段是可修改的,那么创建翻译器将非常困难,因为您需要考虑自修改代码的可能性。任何此类翻译器都需要在生成的代码中包含其自身的副本;那时最容易“完成”模拟器。

如果代码段不可修改,那仍然非常困难,因为使用 x86 可以跳转到指令的中间,并将其解释为不同的指令。因此,虽然原则上您可以为所有可能的起始地址构建一个静态转换,并构建一个大跳转表来确定您需要哪种静态转换,但这仍然不值得。

我建议不要将通用 x86 代码转换为该子集,而是限制 GA 生成的代码以使其适合该子集。您可以尝试使用google native client paper中描述的技术来进一步限制代码以避免跳转到指令中间问题。

或者,总是可以选择使用完整的 x86 仿真器而不是有限的仿真器。但是,您仍然会遇到 GA 生成非法操作码的问题。您还可以考虑使用定制设计的易于模拟的ISA而不是 x86 并模拟. 然后编译到 x86(您确实将其设计为易于编译,对吗?)当您有想要保留的东西时。

该参考资料似乎也与您正在做的事情相似,您可能想看看:

  1. 诺丁,彼得。“一种直接操纵机器代码的编译遗传编程系统。 ” 遗传编程的进展。马萨诸塞州剑桥:麻省理工学院,1994. 311-32。打印。
于 2009-11-15T18:33:10.800 回答