7

質問

Delphi でアセンブリを使用する方法を学習するためのリソースはありますか?

背景情報

一般的なアセンブリと命令セットのリファレンス (x86、MMX、SSE など) を見つけて読みました。しかし、その情報を Delphi に適用するのは難しいと感じています。クラスプロパティの値を取得する方法などの一般的なこと。

コードを最適化するときにアセンブリを使用するオプションが必要です。

理解します:

  • コンパイラに勝つのは難しいでしょう。
  • 高レベルの最適化手法は、低レベルのアセンブリ最適化よりも数桁もパフォーマンスを向上させる可能性が高くなります。(異なるアルゴリズムの選択、キャッシュなど)
  • プロファイリングは不可欠です。実際のパフォーマンス分析にはSampling Profilerを使用し、低レベルの詳細には CPU サイクル カウントを使用しています。

次の理由から、Delphi でアセンブリを使用する方法を学ぶことに興味があります。

  • ツールボックスに別のツールを入れても問題ありません。
  • コンパイラが生成したアセンブリ出力を理解するのに役立ちます。
  • コンパイラが何をしているかを理解することは、より良いパフォーマンスの Pascal コードを書くのに役立つかもしれません。
  • 私は興味がある。
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 が導入されると (すぐに)、すべてのアセンブリ コードを 2 回記述する必要があります。

Delphi でより優れたアルゴリズムを取得すると、そのアセンブリ コードを記述する必要がまったくなくなります。

アセンブリが役立つ主な領域は (ただし、よく巧妙に作成された Delphi コードも大いに役立ちます)、たとえば暗号化を行う場合の低レベルのビット/バイト操作です。一方、FastMM (Delphi の高速メモリ マネージャー) では、ほとんどすべてのコードが Delphi で記述されています。

Macro がすでに書いたように、逆アセンブルされたコードから始めることは、多くの場合、良い出発点です。しかし、アセンブリの最適化は非常に効果的です。
出発点として使用できる例は、たとえば、Delphi またはアセンブリ コードのいずれかを使用するためのオプションがあるSynCrypto ユニットです。

于 2011-08-17T04:43:09.307 に答える
5

私があなたの投稿を読んだ方法では、あなたはアセンブラー リソースを探しているのではなく、Delphi 宣言がメモリ内でどのように構造化されているかを説明するリソースとして、アセンブラー経由でアクセスできるようにしています。これは確かに見つけるのが難しいことですが、不可能ではありません。

これは、 Delphiが宣言を構造化する方法を理解し始めるために見つけた優れたリソースです。アセンブラは、CPU で定義されたデータ型への個別のデータ アドレスのみを扱うため、Delphi 構造を理解して適切にアクセスする限り、どの Delphi 構造でも問題ありません。

その他の唯一の懸念事項は、Delphi プロシージャと関数ヘッダーを操作して必要なデータを取得する方法です (Delphi インライン機能を使用してアセンブラを実行する場合) が、標準の関数呼び出し規則を理解する必要があります。 これこれは、それらを理解するのに役立ちます。

インライン アセンブラとは対照的に、実際のアセンブラ (リンクされた OBJ ファイル) を使用することは、選択したアセンブラによって異なる別のトピックです。それに関する情報も見つけることができますが、興味があれば、いつでもその質問をすることもできます.

HTH。

于 2011-08-17T05:50:20.640 に答える
4

BASM を効率的に使用するには、(1)Delphi が低レベルでどのように動作するか、および(2)アセンブリについての知識が必要です。ほとんどの場合、これらの両方が 1 か所で説明されていることはありません。

ただし、Dennis Christensen の初心者向けBASMとこのDelphi3000 の記事は、その方向に進んでいます。より具体的な質問については、Stackoverflow の他に、Embarcadero のBASM フォーラムも非常に役立ちます。

于 2011-08-17T08:25:10.147 に答える
2

最も簡単な解決策は、常にパスカルでコーディングし、生成されたアセンブラを確認することです。

速度的には、アセンブラは通常、タイトなループでのみプラスになり、一般的なコードでは、改善があったとしてもほとんどありません。私のコードにはアセンブラーが 1 つしかありませんが、固定小数点 SSE で浮動小数点ベクトル演算を再コーディングすることで利点が得られます。SIMD 命令セットによって提供される飽和は、追加のボーナスです。

さらに悪いことに、Web に出回っているあまりお勧めできないアセンブラー コードは、最新のプロセッサーでは同等の Pascal コードよりも実際には低速です。


アップデート:

次に、アセンブラ ループに入る前に、プロシージャのプロローグでクラス プロパティをローカル変数にロードするか、アセンブラを別のプロシージャに移動します。あなたの戦いを選択してください。

RTL/VCL ソースを調べると、特定の構成要素にアクセスする方法のアイデアが得られる場合もあります。

ところで、すべての低レベルの最適化がアセンブラを使用して行われるわけではありません。Pascal レベルでは、ポインターの知識があれば多くのことができます。また、キャッシュの最適化なども Pascal レベルで実行できる場合があります (例:ローテーション ビットマップのキャッシュの最適化 を参照) 。

于 2011-08-17T02:09:57.903 に答える