重构反汇编代码
我们编写了一个函数,然后查看生成的程序集,就可以看到它可以得到改进。
我们希望保留编写的函数以提高可读性,但我们想用自己的程序集代替编译器的程序集。有什么方法可以在高级语言功能和新程序集之间建立关系?
解决方案
回答
没有,我想。我们已经拒绝了编译器的工作,而选择了自己的工作。我们最好扔掉用编译语言编写的函数,因为现在我们所拥有的只是该平台上的汇编程序。
我强烈建议我们不要进行这种优化,因为除非通过分析和分析确定我们确实在有所作为,否则请不要这样做。
回答
这取决于我们编写函数时使用的语言。某些语言(例如C)是非常底层的,可将每个函数调用或者语句转换为特定的汇编语句。如果我们确实使用过C,则可以用内联汇编替换函数以提高性能。
其他高级语言可以将每个语句转换为宏例程,或者在汇编端进行其他更复杂的调用。某些优化(例如尾部递归,循环展开等)可以在源端轻松实现,而其他优化(例如更有效地使用寄存器文件)可能是不可能的(再次取决于我们使用的语言和编译器)使用)。
回答
很难说修改的程序集与生成未修改版本的源代码之间存在任何关系。这肯定会使调试工具感到困惑:寄存器内容将不再与它们应该对应的源变量匹配。
在数据包处理代码中,有很多地方我检查了生成的程序集,然后返回更改原始源代码以改善结果。重新排列源代码可以减少分支的数量,__ attribute__和编译器参数可以对齐分支点和函数以减少I $丢失。在绝望的情况下,可以使用一些内联汇编,以便仍可以从源代码编译二进制文件。
回答
如果我们正在查看程序集,那么可以公平地假设我们对如何编译代码有很好的了解。如果我们掌握了这些知识,那么有时可以"逆向工程"将更改恢复为原始语言,但通常最好不要打扰。
与首先进行这些更改所需的时间和精力相比,我们所做的优化可能很小。我建议我们将这种工作留给编译器,然后去喝杯茶。如果变化很大,并且性能很关键(例如在嵌入式世界中),那么我们可能希望以某种方式将常规代码与汇编程序混合使用,但是,在大多数计算机和芯片上,性能通常足以避免头疼
如果我们确实需要更高的性能,请优化代码而不是汇编。
回答
我们可以尝试的方法是将原始函数分离到自己的文件中,并提供一个make规则来从那里构建汇编程序。然后使用改进的版本更新汇编程序文件,并提供一个生成规则,以从汇编程序文件构建目标文件。然后更改链接规则以包括该目标文件。
如果我们只更改了汇编器文件,则该文件将继续使用。如果我们更改了原始的高级语言文件,则将重建汇编文件,并从新的(未经改进的)版本中构建目标文件。
这为我们提供了两者之间的关系。我们可能想在高级语言文件的顶部添加警告注释,以警告该行为。如果我们在此处出错,则使用某种形式的VCS将使我们能够恢复改进的汇编器文件。
回答
如果我们使用Visual C ++编写本机编译的应用程序,则有两种方法:
- 使用
__asm {}
块,然后在其中编写汇编程序。 - 在MASM汇编器中编写函数,将其汇编为.obj,并将其链接为静态库。在C / C ++代码中,使用
extern" C"
声明来声明函数。
其他C / C ++编译器也有类似的方法。
回答
在这种情况下,通常有两个选择:优化代码或者重写编译器。我看不出在哪里断开Source和Op之间的链接将永远是正确的解决方案。