7

问题

有没有学习如何在 Delphi 中使用汇编的资源?

背景资料

我找到并阅读了一些通用汇编和指令集参考(x86、MMX、SSE 等)。但是我发现很难在 Delphi 中应用这些信息。一般的事情,比如如何获取类属性的值等。

我希望在优化代码时可以选择使用汇编。

我明白:

  • 很难击败编译器。
  • 与低级装配优化相比,高级优化技术更有可能将性能提高几个数量级。(如选择不同的算法、缓存等)
  • 剖析至关重要。我正在使用Sampling Profiler进行实际性能分析,并使用 CPU 周期计数来获取低级细节。

我有兴趣学习如何在 Delphi 中使用汇编,因为:

  • 在工具箱中拥有另一个工具不会有什么坏处。
  • 这将有助于理解编译器生成的汇编输出。
  • 了解编译器在做什么可能有助于编写性能更好的帕斯卡代码。
  • 我很好奇。
4

5 回答 5

12

这是一个可能有用的资源......

www.guidogybels.eu/docs/Using%20Assembler%20in%20Delphi.pdf

(我想用这个信息向@Glenn 添加评论,但由于我是这个论坛的新手并且没有足够的代表,我被迫使用答案机制......)

于 2011-08-17T12:42:28.427 回答
6

大多数优化都涉及创建更好的算法:通常这就是您可以获得“数量级”速度改进的地方。

x64 汇编世界是 x86 汇编世界的一大变化。这意味着随着 XE2 中 Delphi 中 x64 的引入(现在很快),您将不得不编写所有的汇编代码两次

让自己在 Delphi 中获得更好的算法可以让你完全不用编写汇编代码。

汇编可以帮助的主要领域(但通常巧妙地制作的 Delphi 代码也有很大帮助)是低级别的位/字节旋转,例如在进行加密时。另一方面,FastMM(Delphi 的快速内存管理器)几乎所有的代码都是用 Delphi 编写的。

正如 Macro 已经写的:从反汇编代码开始通常是一个好的开始。但是装配优化可以走得很远。
一个可以作为起点的例子是SynCrypto 单元,它可以选择使用 Delphi 或汇编代码。

于 2011-08-17T04:43:09.307 回答
5

按照我阅读您帖子的方式,您寻找的不是汇编程序资源,而是解释 Delphi 声明如何在内存中构造的资源,以便您可以通过汇编程序访问它们。这确实是一件很难找到的事情,但并非不可能。

是我发现的一个很好的资源,可以帮助我了解 Delphi 如何构建其声明。由于汇编程序只涉及到 CPU 定义的数据类型的离散数据地址,因此只要您理解并正确访问它,您就可以使用任何 Delphi 结构。

唯一的另一个问题是如何与 Delphi 过程和函数头交互以获取您想要的数据(假设您想使用 Delphi 内联工具进行汇编程序),但这仅涉及对标准函数调用约定的理解。 将有助于理解这些。

现在使用实际的汇编器(链接的 OBJ 文件)而不是内联汇编器是另一个主题,这将根据选择的汇编器而有所不同。你也可以找到这方面的信息,但如果你有兴趣,你也可以随时问这个问题。

HTH。

于 2011-08-17T05:50:20.640 回答
4

要有效地使用 BASM,您需要了解 (1) Delphi 如何在低级别做事和 (2) 汇编。大多数情况下,您不会在一个地方找到这两件事的描述。

但是,Dennis Christensen 的初学者 BASM和这篇Delphi3000 文章朝着这个方向发展。对于更具体的问题,除了 Stackoverflow,Embarcadero 的BASM 论坛也非常有用。

于 2011-08-17T08:25:10.147 回答
2

最简单的解决方案总是用 pascal 编码,然后查看生成的汇编程序。

在速度方面,汇编程序通常仅在紧密循环中处于优势,并且在一般代码中几乎没有改进(如果有的话)。我的代码中只有一个汇编程序,其好处来自在定点 SSE 中重新编码浮点向量运算。SIMD 指令集提供的饱和度是一个额外的好处。

更糟糕的是,由于处理器的权衡随着时间的推移而变化,所以在网络上漂浮的很多不明智的汇编代码实际上比现代处理器上的帕斯卡等效代码要慢。


更新:

然后,在进入汇编程序循环之前,只需在过程的序言中将类属性加载到本地变量中,或者将汇编程序移动到不同的过程。选择你的战斗。

研究 RTL/VCL 源代码也可能会产生如何访问某些结构的想法。

顺便说一句,并非所有低级优化都是使用汇编程序完成的。在 Pascal 级别上,通过一些指针知识也可以完成很多工作,并且有时也可以在 Pascal 级别上完成诸如缓存优化之类的事情(参见例如旋转位图的缓存优化

于 2011-08-17T02:09:57.903 回答