2016-12-18 10 views
5

x64モードのMSVCコンパイラがコードのインラインアセンブリスニペットをサポートしていないことを知っています。アセンブリコードを使用するには、そのような外部my_asm_funcs.asmファイルで関数を定義する必要があります。 :x64でアセンブリ関数をインラインで作成するVisual Studio

my_asm_func PROC 
    mov rax, rcx 
    ret 
my_asm_func ENDP 

そしてあなたの.cまたは.hファイルに次のような機能のためのヘッダーを定義します。

int my_asm_func(int x); 

そのソリューションは、多くの懸念に答えるが、私はまだことを行うことに興味を持っていますが、アセンブリコード関数は、インラインになる、言い換えれば - comの後にpiling私はmy_asm_funcに "呼び出し"したくないので、このアセンブリを最終的にコンパイルされたコードに貼り付けるだけでいいです。私はインラインで関数を宣言しようとしました__forceinlineキーワードは何も役に立ちません。それでも私がしたいことをする方法はありますか?

+2

コンパイラ組み込み関数を検索しましたか? 'my_asm_func'の機能をカバーするものがあるかもしれません。一般的には、独自のアセンブリをインラインでコンパイラと混在させることは、最適化のレベルに応じて多くの最適化を行いますが、メンテナンスはもちろんのこと、動作するのは難しいかもしれません。 –

+1

いいえ、できません。何らかの理由でこれを参照してください(同じような質問への回答)(http://stackoverflow.com/a/5542379/597607)。 –

答えて

10

いいえ、希望する方法はありません。

マイクロソフトのコンパイラは、あなたが言ったように、x86-64ターゲットのインラインアセンブリをサポートしていません。これにより、外部コードモジュール(* .asm)でアセンブリ関数を定義し、それらをMASMでアセンブルし、結果を個別にコンパイルされたC/C++コードとリンクさせる必要があります。

必要なステップの分離は、コンパイル時にC/C++コンパイラが表示されないため、C/C++コンパイラがアセンブリ関数をインライン化できないことを意味します。

リンク時コード生成(LTCG)を有効にしても、リンカがこれをサポートしないため、アセンブリモジュールはインライン化されません。

別のモジュールで記述されたアセンブリ関数を直接CまたはC++コードにインライン化する方法はまったくありません。

inlineまたは__forceinlineキーワードは何も実行できません。実際には、コンパイラエラー(または少なくとも警告)なしでそれらを使用する方法はありません。これらの注釈は、関数の定義(インライン関数の場合は宣言と同じです)に移動する必要がありますが、別の* .asmファイルで定義されているため、関数の定義に入れることはできません。これらはMASMキーワードではないので、定義に追加しようとすると必然的にエラーになります。また、Cヘッダーのアセンブリ関数の前方宣言にそれらを置くことは、インライン化するコードがないので、同様にうまくいっていません。プロトタイプだけです。

これは、マイクロソフトがの組み込み関数を使用することを推奨する理由です。これらはCまたはC++コードで直接使用でき、コンパイラは対応するアセンブリコードを自動的に生成します。これにより、望ましいインライン化が達成されるだけでなく、イントリンシックスがオプティマイザを機能させ、さらに結果を改善することさえできます。いいえ、組み込み関数は完全なコードにつながるわけではなく、すべての組み込み関数はありませんが、Microsoftのコンパイラで行うことができます。

あなたの唯一の選択肢は、コンパイラが目的のオブジェクトコードを生成するまで、さまざまなC/C++コードの並べ替えで座って遊ぶことです。これは、生成される命令に組み込み関数がない場合には非常に強力ですが、時間がかかりすぎてしまいますので、それを再確認して、実行し続けることを確認してくださいコンパイラのバージョンをアップグレードするときに必要です。

関連する問題