Visual Studioを使用してアセンブリコードをどのようにコンパイルしますか?
Visual Studio 201 でアセンブリソースファイルをコンパイルして実行したい。
Visual C++プロジェクトを作成し、ファイルにアセンブリコードを挿入しましたcode.asm
:
.586 ;Target processor. Use instructions for Pentium class machines
.MODEL FLAT, C ;Use the flat memory model. Use C calling conventions
.STACK ;Define a stack segment of 1KB (Not required for this example)
.DATA ;Create a near data segment. Local variables are declared after
;this directive (Not required for this example)
.CODE ;Indicates the start of a code segment.
clear PROC
xor eax, eax
xor ebx, ebx
ret
clear ENDP
END
ただし、これを試してコンパイルすると問題が発生します:
LINK : error LNK2001: unresolved external symbol _mainCRTStartup
ビルドのカスタマイズを有効にしてmasm.targets
(プロジェクトを右クリックして[カスタマイズをビルド...])、しかし効果はありません。
.asmファイルのカスタムビルドルールが有効になっていないように思えます。プロジェクト、Custom Build Rulesを右クリックし、「Microsoft Macro Assembler」にチェックマークを付けます。 「END clear」ディレクティブとインクリメンタルリンクを無効にすると、クリーンなビルドが得られます。
VS201からは異なります:
.asm
ファイルを右クリックして、プロパティ、アイテムタイプを「Microsoft Macro Assembler」に変更します。以下を使用してコードをコンパイルします。
ml /c /Cx /coff code.asm
出力としてcode.objを取得します。
とのリンク:
link code.obj /SUBSYSTEM:console /out:go.exe /entry:clear
これでgo.exeを実行できます。
または、次のようにすべてを一度に実行します。
ml /Cx /coff code.asm /link /SUBSYSTEM:console /link /entry:clear
Visual Studioには [〜#〜] masm [〜#〜] マクロアセンブラーが含まれています。アセンブラコードの小さな断片は、多くの場合、CまたはC++プログラムの インラインアセンブリ で記述されます。
Visual Studioプロジェクトにアセンブラファイルを統合するには、通常のC/C++プロジェクト(コマンドラインまたはGUI)を作成し、.asm
で終わるファイルをソースファイルのリストに追加します。
エントリポイントとしてclearを指定するには、次の手順に従います。
プロジェクトの[プロパティページ]ダイアログボックスを開きます。詳細については、「Visual C++プロジェクトプロパティの設定」を参照してください。
[リンカ]フォルダをクリックします。
[詳細プロパティ]ページをクリックします。
エントリポイントプロパティを変更します。
(これは Visual Studioのドキュメント から取られました。)
Hans Passantの指示を確認できます。さらに、 この記事 によると、最初に「ビルドカスタマイズ」masmチェックボックスを追加してからファイルを追加すると、自動的にアセンブラファイルとして認識されます。さらに、ENDディレクティブでエントリポイント名を指定するのではなく、プロジェクト設定で指定することもできます。
vs20xxでnasmアセンブリソースコードをコンパイルする方法は次のとおりです。
「ビルドから除外」から「いいえ」
「アイテムタイプ」から「カスタムビルドツール」
適用を押す
カスタムビルドツール->一般->コマンドライン:
c:\ nasm\nasm -f win64 my_asm.asm
カスタムビルドツール->一般->出力:
my_asm.obj
次のような関数を呼び出します。
extern "C" int foo(void); //アセンブリで書かれています!
https://www.cs.uaf.edu/2017/fall/cs301/reference/nasm_vs/
nasmチュートリアル:
問題は、アセンブリコードが単なる関数であることです。コンパイルしてリンクするには、C/C++のMain
のような開始プロシージャが必要です。 END
ディレクティブで指定することにより、開始記号を指定できます。のような:
END clear
または、必要に応じて、生成された.objファイルをC/C++で生成された.objファイルにリンクできます。