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

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

有帮助吗?

解决方案

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

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

如果你 真的 需要更多性能,然后优化代码而不是汇编。

其他提示

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

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

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

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

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

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

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

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

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

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

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

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

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

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top