我正在为 MIPS 架构开发一个非常简单的反编译器,随着我的进步,我必须为代码分析定义许多规则,例如“如果这个操作码是lui并且下一个操作码是addiu然后返回var = value ”或“如果这个操作码是bne,它指的是当前地址之前的地址 - 创建循环解析树中的定义”。问题 - 有很多这样的规则,我找不到定义它们的好方法。我尝试为每个规则编写单独的函数,定义好的 OOP 基础逻辑类并将它们扩展以创建规则,甚至尝试在 disasmed 代码上使用正则表达式(令我惊讶的是,这比预期的效果更好)但无论我尝试了什么,我的代码很快变得很大并且很难阅读,无论我尝试记录和构建的效果如何它。
这让我得出结论,我试图通过使用错误的工具来解决这个任务(更不用说对于如此复杂的任务来说太愚蠢了:)),但我不知道我应该尝试什么。目前我有两个未经测试的想法,一个是使用某种 DSL(我完全没有这方面的经验,所以我可能完全错了),另一个是编写某种类似于二进制正则表达式的工具来进行操作码匹配。
我希望有人能指出我正确的方向,谢谢。