在Delphi中使用Assembly的好资源?

时间:2011-08-17 01:37:18

标签: delphi optimization assembly basm

问题

是否有任何资源可以学习如何在Delphi中使用程序集?

背景资料

我找到并阅读了一些通用程序集和指令集引用(x86,MMX,SSE等)。但我发现很难在Delphi中应用这些信息。一般的事情,如如何获得类属性的价值等。

我希望选项在优化代码时使用程序集。

我理解:

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

我有兴趣学习如何在Delphi中使用程序集,因为:

  • 在工具箱中安装另一个工具不会有什么坏处。
  • 这将有助于理解编译器生成的程序集输出。
  • 了解编译器正在做什么可能有助于编写性能更好的pascal代码。
  • 我很好奇。

5 个答案:

答案 0 :(得分:12)

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

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

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

答案 1 :(得分:6)

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

x64汇编世界是对x86汇编世界的重大改变。这意味着随着XE2中Delphi中引入x64(现在很快),你必须编写所有汇编代码两次

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

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

正如Macro已经写过:从反汇编代码开始通常是一个好的开始。但是装配优化可以走得很远 您可以用作起点的示例是SynCrypto unit,其中包含使用Delphi或汇编代码的选项。

答案 2 :(得分:5)

我阅读你的帖子的方式,你并不是在寻找汇编资源和资源来解释Delphi声明如何在内存中构建,以便你可以通过汇编程序访问它们。这确实很难找到,但并非不可能。

Here是一个很好的资源,我发现它开始理解Delphi如何构造它的声明。由于汇编程序只将自身的离散数据地址与CPU定义的数据类型相关联,因此只要您理解并正确访问它,您就可以使用任何Delphi结构。

唯一的另一个问题是如何与Delphi过程和函数头交互以获取所需的数据(假设您想使用Delphi内联工具进行汇编),但这只涉及了解标准函数调用约定。在理解这些内容时,Thisthis对此非常有用。

现在使用实际的汇编程序(链接的OBJ文件)而不是内联汇编程序是另一个主题,它将根据所选的汇编程序而有所不同。您也可以找到相关信息,但如果您有兴趣,也可以随时提出这个问题。

HTH。

答案 3 :(得分:4)

要有效地使用BASM,您需要了解(1)Delphi如何处理低级别的事情和(2)组装。大多数时候,你不会在一个地方找到这两样的东西。

然而,Dennis Christensen的BASM for beginnerDelphi3000 article朝着这个方向前进。对于更具体的问题,除了Stackoverflow之外,Embarcadero的BASM forum也非常有用。

答案 4 :(得分:2)

最简单的解决方案始终是在pascal中编码,并查看生成的汇编程序。

纵向,汇编程序在紧密循环中通常只有一个加号,而在一般代码中,如果有的话几乎没有改进。我的代码中只有一个汇编程序,其好处来自于在定点SSE中重新编码浮点向量运算。 SIMD指令集提供的饱和度是额外的奖励。

甚至更糟糕的是,在网络上浮动的汇编代码实际上比现代处理器上的pascal代码慢得多,因为处理器的权衡随着时间的推移而变化。


更新

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

学习RTL / VCL源也可能会产生如何访问某些结构的想法。

顺便说一句,并非所有低级优化都是使用汇编程序完成的。在Pascal级别上有一些指针知识也可以做很多事情,像缓存优化这样的东西有时也可以在Pascal级别上完成(参见例如Cache optimization of rotating bitmaps