2

您编写了一个函数,然后查看生成的程序集,您会发现它可以改进。

为了便于阅读,您想保留您编写的函数,但您想用自己的程序集替换编译器的程序集。有什么方法可以在您的高级语言功能和新程序集之间建立关系?

4

7 回答 7

3

如果您正在查看程序集,那么假设您对如何编译代码有很好的理解是公平的。如果您有这方面的知识,那么有时可以将更改“反向工程”回原始语言,但通常最好不要打扰。

与首次进行这些更改所需的时间和精力相比,您所做的优化可能非常小。我建议你把这种工作留给编译器去喝杯茶。如果更改很重要,并且性能很关键,(例如在嵌入式世界中),那么您可能希望以某种方式将普通代码与汇编混合,但是,在大多数计算机和芯片上,性能通常足以避免这个头痛。

如果你真的需要更高的性能,那么优化代码而不是程序集。

于 2008-09-15T16:26:18.083 回答
2

没有,我想。你已经拒绝了编译器的工作而支持你自己的工作。您不妨扔掉用编译语言编写的函数,因为现在您所拥有的只是该平台上的汇编程序。

我强烈建议不要进行这种优化,因为除非您通过分析和分析确定您确实在发挥作用。

于 2008-09-15T16:17:38.540 回答
1

这取决于您编写函数的语言。某些语言(如 C)非常低级,将每个函数调用或语句转换为特定的汇编语句。如果您确实使用过 C,则可以用内联汇编替换您的函数以提高性能。

其他高级语言可以将每个语句转换为宏例程或汇编端的其他更复杂的调用。某些优化(如尾递归、循环展开等)可以在源代码端轻松实现,但其他优化(如更有效地使用寄存器文件)可能是不可能的(同样,取决于您所使用的语言和编译器)使用)。

于 2008-09-15T16:24:23.220 回答
1

很难说修改后的程序集与生成未修改版本的源之间有任何关系。它肯定会混淆调试工具:寄存器内容将不再匹配它们应该对应的源变量。

在数据包处理代码中有很多地方我检查了生成的程序集并返回更改原始源代码以改进结果。重新排列源代码可以减少分支的数量,__attribute__ 和编译器参数可以对齐分支点和函数以减少 I$ 未命中。在绝望的情况下,可以使用一点内联汇编,以便仍然可以从源代码编译二进制文件。

于 2008-09-15T16:25:39.990 回答
1

您可以尝试将原始函数分离到它自己的文件中,并提供一个 make 规则来从那里构建汇编程序。然后用改进的版本更新汇编文件,并提供一个生成规则以从汇编文件构建目标文件。然后更改链接规则以包含该目标文件。

如果您只更改汇编文件,它将继续使用。如果您更改了原始的高级语言文件,汇编程序文件将被重新构建,而目标文件则从新的(未改进的)版本构建。

这为您提供了两者之间的关系;您可能希望在高级语言文件的顶部添加警告注释以警告该行为。如果您在此处出错,使用某种形式的 VCS 将使您能够恢复改进的汇编程序文件。

于 2008-09-15T16:27:01.170 回答
1

如果您正在使用 Visual C++ 编写本机编译的应用程序,有两种方法:

  1. 使用该__asm { }块并在其中编写您的汇编程序。
  2. 在MASM汇编器中编写您的函数,汇编为 .obj,并将其链接为静态库。在您的 C/C++ 代码中,使用声明声明函数extern "C"

其他 C/C++ 编译器也有类似的方法。

于 2008-09-15T16:31:36.777 回答
1

在这种情况下,您通常有两种选择:优化代码或重写编译器。我看不出在哪里断开源和操作之间的链接将成为正确的解决方案。

于 2008-09-15T16:32:38.130 回答