我有一种用于x86汇编指令的模拟器,但问题是它不接受完整的指令集。例如,如果给定INT命令,它将终止。可以在模拟器上运行所有命令的二进制表示(8位、16位和32位),看看哪一个是有效的,哪些是无效的。
它用于遗传编程,需要对命令进行二进制表示,但要做到这一点而不创建无效的表示。
最简单的解决方案似乎只是计算它们,但是原始指令集和较小指令集之间的转换函数将如何工作呢?
发布于 2009-11-15 18:33:10
如果代码段是可修改的,那么很难创建一个翻译器,因为您需要考虑自修改代码的可能性。任何这样的翻译都需要在生成的代码中包含一份自己的副本;在这一点上,仅仅‘完成’模拟器是最简单的。
如果代码段不可修改,它仍然非常困难,因为有了x86,就有可能跳入指令的中间,并将其解释为不同的指令。因此,虽然原则上您可以为所有可能的开始地址构建一个静态转换,并构建一个大跳转表来确定您需要哪种静态转换,但这仍然不值得。
我建议不要将一般的x86代码转换成这个子集,而是约束GA生成的代码,使其适合子集。您可以尝试使用诸如谷歌本地客户端文件中描述的技术来进一步限制代码,以避免出现指令中间跳入问题。
另外,可以选择使用完整的x86仿真器而不是有限的模拟器。但是,您仍然会遇到GA生成非法操作码的问题。您还可以考虑使用自定义的ISA,以便于仿真,而不是x86,并对其进行仿真。然后编译到x86 (您确实设计它很容易编译,对吗?)当你有你想要的东西的时候。
此引用似乎与您所做的类似,您可能需要查看一下:
https://stackoverflow.com/questions/1738249
复制相似问题