2011-08-17 82 views
7

問題在Delphi中使用Assembly的好資源?

是否有任何資源用於學習如何在Delphi中使用匯編?

背景信息

我已經找到並閱讀一些大會和指令集的引用(X86,MMX,SSE等)。但是我發現很難在Delphi中應用這些信息。一般的東西,如如何獲得一個類屬性的值等

我想有選項優化代碼時使用匯編。

我的理解:

  • 這將是很難被擊敗的編譯器。
  • 高級優化技術比低級彙編優化更有可能將性能提高几個數量級。 (如選擇不同的algorthims,緩存等)
  • 分析是至關重要的。我正在使用Sampling Profiler來進行實際性能分析和cpu循環計數以獲取低級別細節。

我感興趣的學習如何使用裝配德爾福因爲:

  • 它不能傷害有工具箱中的另一個工具。
  • 這將有助於理解編譯器生成的程序集輸出。
  • 瞭解編譯器在做什麼可能有助於編寫性能更好的pascal代碼。
  • 我很好奇。
+3

只要將它寫入程序集,不會讓它變得更快。編譯器會以更聰明/更快的方式編寫它,編譯器會這樣想。 像獲取類屬性的功能很可能不佔用您的時間,對屬性值的操作可能是您想要在裝配中嘗試的操作。 – PtPazuzu

+2

我不認爲有任何德爾福加彙編書籍。例如,我會從類屬性中獲取值,使用常規的pascal代碼,將結果存儲在本地變量中,然後在我的內聯彙編程序中使用本地變量引用。關於X86 asm一般書籍的相關問題; http://stackoverflow.com/questions/4845/good-x86-assembly-book –

+0

@PtPazuzu:是的,操縱價值是目標。但這有助於首先理解基礎知識。最終,我正在將SSE視爲潛在加速的來源。德爾福沒有充分利用SSE指令呢? – Shannon

回答

12

下面是可幫助資源...

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

(我想添加評論這個信息,以@Glenn,但我不得不使用應答機制,因爲我是新來的這個論壇並沒有足夠的代表...)

+1

謝謝@daemon! –

+1

+1提這篇優秀的文章。我沒想到它仍然在線,因爲Guido似乎沒有再使用Delphi了。 –

2

最簡單的解決方案是始終使用pascal編碼並查看生成的彙編程序。

速度方面,彙編程序通常只在緊密循環中處於加號狀態,並且在通用代碼中幾乎沒有改進,如果有的話。我的代碼中只有一段彙編程序,其好處來自於在定點SSE中重新編碼浮點向量操作。 SIMD指令集提供的飽和度是額外的好處。

甚至更​​糟糕的是,在網絡上浮動的彙編代碼實際上比現代處理器上的pascal代碼慢,因爲處理器的權衡會隨着時間而改變。


更新:

你進入彙編循環之前然後,只需加載一個局部變量的類屬性在你的程序的序幕,或將彙編程序不同的程序。選擇你的戰鬥。

研究RTL/VCL源代碼也可能產生如何訪問某些結構的想法。

順便說一下,並非所有低級別的優化都使用匯編程序完成。在一些指針知識的Pascal水平上也可以做很多事情,像緩存優化這樣的東西有時也可以在Pascal水平上完成(參見例如Cache optimization of rotating bitmaps

+0

我對通用代碼的彙編程序不感興趣。我的應用程序可以實時處理音頻。處理音頻數據本身時,我經常使用緊密循環。根據實際應用,我的目標是在現代CPU上使用不到2%到5%的CPU使用率(僅在實時部分,我非常關心非實時部分的CPU使用率)。所有的「優化」也被標記爲長。我不會盲目地運用任何東西。 – Shannon

+0

隨着新的信息,我更新了我的答案了一下。 –

+0

感謝Marco。緩存優化讀取很有趣。 +1 – Shannon

6

大多數優化涉及創建更好的算法:通常這就是您可以獲得可以獲得'數量級'的速度改善。

x64組裝世界是x86組裝世界的一個重大變化。這意味着在XE2的Delphi中引入x64(現在很快),您必須編寫所有彙編代碼兩次

在Delphi中讓自己更好的算法可以讓您完全無需編寫該彙編代碼。

程序集可以提供幫助的主要區域(但通常是巧妙製作的Delphi代碼也有很大幫助)是低級別的位/字節混搭,例如在進行加密時。另一方面,FastMM(Delphi的快速內存管理器)幾乎全部使用Delphi編寫代碼。

由於宏已經寫道:從反彙編代碼開始往往是一個好的開始。但彙編優化可能會走得很遠。
可以用作起點的示例是SynCrypto unit,它可以使用Delphi或彙編代碼。

+0

+1「大多數優化涉及創建更好的算法」 - 這是主要規則。 –

+0

我知道優化通常是通過高級方式完成的,比如算法選擇,但我不認爲這會否定知道如何在Delphi中使用匯編的價值。 – Shannon

+0

也許創建彙編代碼的最大好處並不在於算法本身(例如,每次壞的快速排序都會完全優化冒泡排序)。它所要做的是如何表達算法。例如,您可以使用Delphi在調用時不使用的CPU指令(即使是x86)(ADC是一個很好的例子)。或者你以這樣的方式進行編碼,以便將任何變量保存在寄存器中。即使你不用匯編語言編寫代碼,掌握它的知識對於更快速的Delphi代碼也是有用的。 – Glenn1234

5

我讀取你的文章的方式,你並沒有像彙編資源那樣尋找資源來解釋Delphi聲明是如何在內存中構造的,所以你可以通過彙編來訪問它們。這確實是一件很難找到的事情,但並非不可能。

Here是一個很好的資源,我發現它開始理解Delphi如何構造它的聲明。由於彙編程序只涉及到CPU定義的數據類型的離散數據地址,只要您瞭解並正確訪問它,您就可以使用任何Delphi結構。

唯一的其他問題是如何與Delphi過程和函數頭進行交互以獲取想要的數據(假設您想使用Delphi內聯工具來完成您的彙編程序),但這隻涉及對標準函數調用的理解約定。 Thisthis將有助於理解這些。

現在使用實際的彙編程序(鏈接的OBJ文件)而不是內聯彙編程序是另一個主題,它將根據所選的彙編程序而變化。你也可以找到有關這方面的信息,但是如果你有興趣,你也可以隨時提出這個問題。

HTH。

+0

謝謝格倫!這正是我期待的信息! – Shannon

+0

通過內聯彙編使用鏈接的OBJ文件是否有優勢? (這應該是另一個問題嗎?) – Shannon

+0

@Shannon據我所知,主要優勢在於,您可能會在「真正的彙編程序」中獲得對Delphi內聯彙編程序無法獲得的指令的支持。奇怪的是,我從來沒有遇到內聯調用「真正的」彙編函數的問題。這取決於你是否從彙編器產品中獲得了你無法從Delphi中獲得的東西。 – Glenn1234

4

爲了高效地使用BASM,您需要了解以下兩方面的知識:(1)德爾福如何在低層次上執行任務;(2)在執行裝配過程中。大多數時候,你不會在一個地方找到這兩件事。

但是,丹尼斯克里斯坦森的BASM for beginner和這Delphi3000 article去那個方向。對於更具體的問題,除了Stackoverflow之外,Embarcadero的BASM forum也是非常有用的。