web-dev-qa-db-ja.com

Visual Studioでアセンブリをコンパイルする

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(プロジェクトを右クリックして[カスタマイズをビルド...])、しかし効果はありません。

51
bobobobo

.asmファイルのカスタムビルドルールが有効になっていないように思えます。プロジェクト、Custom Build Rulesを右クリックし、「Microsoft Macro Assembler」にチェックマークを付けます。 「END clear」ディレクティブとインクリメンタルリンクを無効にすると、クリーンなビルドが得られます。

VS201からは異なります:

  1. プロジェクトカスタマイズのビルドを右クリックし、「masm」にチェックマークを付けます。
  2. .asmファイルを右クリックして、プロパティアイテムタイプを「Microsoft Macro Assembler」に変更します。
61
Hans Passant

コマンドライン:

以下を使用してコードをコンパイルします。

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(未解決)

11
bobobobo

Visual Studioには [〜#〜] masm [〜#〜] マクロアセンブラーが含まれています。アセンブラコードの小さな断片は、多くの場合、CまたはC++プログラムの インラインアセンブリ で記述されます。

Visual Studioプロジェクトにアセンブラファイルを統合するには、通常のC/C++プロジェクト(コマンドラインまたはGUI)を作成し、.asmで終わるファイルをソースファイルのリストに追加します。

エントリポイントとしてclearを指定するには、次の手順に従います。

  1. プロジェクトの[プロパティページ]ダイアログボックスを開きます。詳細については、「Visual C++プロジェクトプロパティの設定」を参照してください。

  2. [リンカ]フォルダをクリックします。

  3. [詳細プロパティ]ページをクリックします。

  4. エントリポイントプロパティを変更します。

(これは Visual Studioのドキュメント から取られました。)

Hans Passantの指示を確認できます。さらに、 この記事 によると、最初に「ビルドカスタマイズ」masmチェックボックスを追加してからファイルを追加すると、自動的にアセンブラファイルとして認識されます。さらに、ENDディレクティブでエントリポイント名を指定するのではなく、プロジェクト設定で指定することもできます。

9

vs20xxでnasmアセンブリソースコードをコンパイルする方法は次のとおりです。

  1. 「ビルドから除外」から「いいえ」

  2. 「アイテムタイプ」から「カスタムビルドツール」

  3. 適用を押す

  4. カスタムビルドツール->一般->コマンドライン:

    c:\ nasm\nasm -f win64 my_asm.asm

  5. カスタムビルドツール->一般->出力:

    my_asm.obj

  6. 次のような関数を呼び出します。

    extern "C" int foo(void); //アセンブリで書かれています!

https://www.cs.uaf.edu/2017/fall/cs301/reference/nasm_vs/

nasmチュートリアル:

http://cs.lmu.edu/~ray/notes/nasmtutorial/

1
sailfish009

問題は、アセンブリコードが単なる関数であることです。コンパイルしてリンクするには、C/C++のMainのような開始プロシージャが必要です。 ENDディレクティブで指定することにより、開始記号を指定できます。のような:

END clear

または、必要に応じて、生成された.objファイルをC/C++で生成された.objファイルにリンクできます。

0
Madhur Ahuja