2

関数を作成し、結果のアセンブリを見ると、改善できることがわかります。

読みやすくするために、作成した関数を保持したいと考えていますが、コンパイラのアセンブリを独自のアセンブリに置き換えたいと考えています。あなたの高度な言語機能と新しいアセンブリの間に関係を確立する方法はありますか?

4

7 に答える 7

3

アセンブリを見ている場合は、コードがどのようにコンパイルされるかについて十分に理解していると想定するのが妥当です。この知識があれば、変更を元の言語に戻す「リバース エンジニアリング」が可能な場合もありますが、気にしない方がよい場合がよくあります。

行う最適化は、最初にこれらの変更を行うために必要な時間と労力に比べて、非常に小さい可能性があります。この種の作業はコンパイラに任せて、お茶を飲みに行くことをお勧めします。変更が重要で、パフォーマンスが重要な場合 (組み込みの世界など)、何らかの方法で通常のコードとアセンブラを混在させたいと思うかもしれませんが、ほとんどのコンピューターとチップでは、パフォーマンスは通常、回避するのに十分です。この頭痛。

より高いパフォーマンスが本当に必要な場合は、アセンブリではなくコードを最適化してください。

于 2008-09-15T16:26:18.083 に答える
2

何もないと思います。あなたは自分の仕事を支持してコンパイラの仕事を拒否しました。コンパイルされた言語で記述した関数を捨てた方がよいかもしれません。なぜなら、そのプラットフォームにはアセンブラーしかないからです。

プロファイリングと分析によって、本当に違いを生み出していると確信できない限り、この種の最適化に従事しないことを強くお勧めします。

于 2008-09-15T16:17:38.540 に答える
1

変更されたアセンブリと、変更されていないバージョンを生成したソースとの間に何らかの関係があるとは言い難いです。デバッグ ツールが混乱することは間違いありません。レジスタの内容は、対応するはずのソース変数と一致しなくなります。

パケット処理コードには、生成されたアセンブリを調べて、結果を改善するために元のソース コードを変更した箇所が数多くあります。ソースを再配置すると、分岐の数を減らすことができます。__attribute__ とコンパイラの引数は、分岐点と関数を揃えて I$ ミスを減らすことができます。絶望的なケースでは、バイナリをソースからコンパイルできるように、インライン アセンブリを少し使用できます。

于 2008-09-15T16:25:39.990 に答える
1

元の関数を独自のファイルに分割し、そこからアセンブラーをビルドするための make 規則を提供することもできます。次に、改善されたバージョンでアセンブラー ファイルを更新し、アセンブラー ファイルからオブジェクト ファイルを構築するための make 規則を提供します。次に、そのオブジェクト ファイルを含めるようにリンク ルールを変更します。

アセンブラ ファイルのみを変更すると、それが引き続き使用されます。元の高水準言語ファイルを変更すると、アセンブラー ファイルが再構築され、オブジェクト ファイルが新しい (改善されていない) バージョンから構築されます。

これにより、2 つの関係が得られます。高水準言語ファイルの先頭に警告コメントを追加して、動作について警告することをお勧めします。ここで間違いを犯した場合、何らかの形式の VCS を使用すると、改善されたアセンブラー ファイルを回復することができます。

于 2008-09-15T16:27:01.170 に答える
1

Visual C++ でネイティブ コンパイル アプリを作成している場合は、次の 2 つの方法があります。

  1. ブロックを使用して__asm { }、そこにアセンブラを記述します。
  2. 関数をMASMアセンブラーで記述し、.obj にアセンブルして、静的ライブラリとしてリンクします。C/C++ コードで、宣言を使用して関数をextern "C"宣言します。

他の C/C++ コンパイラにも同様のアプローチがあります。

于 2008-09-15T16:31:36.777 に答える
1

この状況では、通常、コードを最適化するか、コンパイラを書き直すかの 2 つのオプションがあります。ソースと運用の間のリンクを壊すことが正しい解決策になる場所がどこにあるのかわかりません。

于 2008-09-15T16:32:38.130 に答える
1

関数を記述した言語によって異なります。C などの一部の言語は非常に低レベルであり、各関数呼び出しまたはステートメントを特定のアセンブリ ステートメントに変換します。C を使用した場合は、関数をインライン アセンブリに置き換えてパフォーマンスを向上させることができます。

他の高級言語では、アセンブリ側で各ステートメントをマクロ ルーチンまたはその他のより複雑な呼び出しに変換できます。特定の最適化 (末尾再帰、ループ展開など) はソース側で簡単に実装できますが、他のもの (レジスタ ファイルをより効率的に使用するなど) は不可能な場合があります (これも、使用している言語とコンパイラによって異なります)。使用)。

于 2008-09-15T16:24:23.220 に答える