3

我面临着在一个超过 10,000 行的汇编程序中发现一个错误,并在未来对其进行维护。它涉及 PIC18 微芯片微控制器的汇编代码。该代码是由一位不再可用的前同事编写的,他没有留下任何文档,而且他的代码的注释也很差。

该代码还使用了许多直接 goto 和 bra 以及相关的(例如 $+0x06),所以我非常害怕编辑它。

我宁愿将他的汇编源代码反编译成“新的”C 代码(或 C++)并从那里开始工作。我想知道:

  1. 反编译的汇编器 -> C 代码是否 100% 正常运行?
  2. 直接和相对 goto 会发生什么?
  3. 是否有任何免费或便宜的工具可用于反编译 PIC18 代码?
4

3 回答 3

4

这是我的看法:

  1. 不,我希望这是可能的,因为不能保证 C 可以准确地表达特定 CPU 可以在汇编级别执行的所有操作,其方式足够直截了当,可以在反编译器中实现。当然,他们都是都灵完整的,但魔鬼肯定在细节中,在这里。
  2. 例如,这是一个特殊的问题。在汇编中当然有可能跳转到例如 C 语句的中间,这使得反转变得复杂。
  3. 我不这么认为,不。

有关问题空间的更多信息,请查看Boomerang 项目的常见问题解答

于 2012-08-30T13:22:28.973 回答
2

非 mips 图片对编译器非常不友好,使用 C 语言在消耗限制资源方面速度慢且成本高。

gotos 和分支是处理器的工作方式,它们没有错。

我将首先删除相关分支并用标签替换它们,通过比较修改前代码和修改后代码的二进制文件,您应该可以轻松检查您是否添加了新错误。一旦相关分支都使用标签,您就可以添加或删除代码,而不必担心破坏其他内容。

反编译器不工作也不能工作。这就像试图将午餐时吃的炸薯条从肠道中取出并试图恢复原来的马铃薯(当然不带皮,除非它们是带皮的薯条)。原始源代码在成为提供给汇编器的 asm 之前已经经过多次烹调和处理,然后如果您使用对象和链接器,它会再次被烹调(嗯……预热)。在无法恢复的过程中丢失了太多的材料。

很有可能进行静态二进制翻译,并获得 C 语言中的某些内容,但比 asm 更难阅读和维护,尤其是对于带有标志的体系结构。翻译器不会完美地删除所有死代码。每条加法指令都将是加法本身加上检测溢出的代码,如果溢出设置标志,否则清除,如果结果等于 0,则设置标志,否则如果 msbit 设置则清除设置 n 位,否则清除,如果有av 位然后如果有符号溢出则设置 v 位否则清除,一行简单的 asm 变成 10 行 C 代码,除非翻译器可以自动删除该死代码。

于 2012-08-30T14:03:05.257 回答
0

虽然反编译本身在某种程度上是可能的,但它是否适用于您的情况是另一回事,这取决于可用的软件。就我个人而言,我会开始手动破译代码并用 C 粗略地重构代码。当然,这是一项乏味的任务,可能会涉及很多错误和错误,但如果你应该维护代码库,那么尝试制作是显而易见的以后该任务尽可能简单——也许未来的维护者也会欣赏你的工作。

于 2012-08-30T16:56:14.140 回答