问题
是否有任何资源可以学习如何在Delphi中使用程序集?
背景资料
我找到并阅读了一些通用程序集和指令集引用(x86,MMX,SSE等)。但我发现很难在Delphi中应用这些信息。一般的事情,如如何获得类属性的价值等。
我希望选项在优化代码时使用程序集。
我理解:
我有兴趣学习如何在Delphi中使用程序集,因为:
答案 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内联工具进行汇编),但这只涉及了解标准函数调用约定。在理解这些内容时,This和this对此非常有用。
现在使用实际的汇编程序(链接的OBJ文件)而不是内联汇编程序是另一个主题,它将根据所选的汇编程序而有所不同。您也可以找到相关信息,但如果您有兴趣,也可以随时提出这个问题。
HTH。
答案 3 :(得分:4)
要有效地使用BASM,您需要了解(1)Delphi如何处理低级别的事情和(2)组装。大多数时候,你不会在一个地方找到这两样的东西。
然而,Dennis Christensen的BASM for beginner和Delphi3000 article朝着这个方向前进。对于更具体的问题,除了Stackoverflow之外,Embarcadero的BASM forum也非常有用。
答案 4 :(得分:2)
最简单的解决方案始终是在pascal中编码,并查看生成的汇编程序。
纵向,汇编程序在紧密循环中通常只有一个加号,而在一般代码中,如果有的话几乎没有改进。我的代码中只有一个汇编程序,其好处来自于在定点SSE中重新编码浮点向量运算。 SIMD指令集提供的饱和度是额外的奖励。
甚至更糟糕的是,在网络上浮动的汇编代码实际上比现代处理器上的pascal代码慢得多,因为处理器的权衡随着时间的推移而变化。
更新
然后在进入汇编程序循环之前,只需在程序的序言中的本地var中加载class属性,或者将汇编程序移动到其他过程。选择你的战斗。
学习RTL / VCL源也可能会产生如何访问某些结构的想法。
顺便说一句,并非所有低级优化都是使用汇编程序完成的。在Pascal级别上有一些指针知识也可以做很多事情,像缓存优化这样的东西有时也可以在Pascal级别上完成(参见例如Cache optimization of rotating bitmaps)