x64 用 MASM (ml64.exe)
Visual Studio には、x64 コードを対象として、32 ビットおよび 64 ビットの両方のホスト バージョンの MASM (Microsoft マクロアセンブラー) が含まれています。 名前付き ml64.exe は、x64 アセンブラー言語を受け入れるアセンブラーです。 MASM コマンド ラインツールは、Visual Studio のインストール中に C++ ワークロードを選択するとインストールされます。 MASM ツールを、個別にダウンロードすることはできません。 Visual Studio のコピーをダウンロードしてインストールする方法の詳細については、「Visual Studio のインストール」をご覧ください。 コマンドライン ツールのみが必要な場合は、IDE 全体ではなく、Build Tools for Visual Studio をダウンロードしてください。
コマンド ラインで ml64.exe を使用するには、x64 ターゲット用の開発者コマンド プロンプトを開始してください。 開発者コマンド プロンプトが表示されたら、必要なパスとその他の環境変数を設定します。 開発者コマンド プロンプトを起動する方法の詳細については、コマンド ライン上で C/C++ コードのビルドに関するページを参照してください。
ml64.exe のコマンドライン オプションの詳細については、「ML および ML64 のコマンド ライン リファレンス」を参照してください。
インライン アセンブラーまたはASM
キーワードの使用は、x64 および ARM64 のいずれのターゲットでもサポートされていません。 インライン アセンブラーを使用する x86 コードを x64 または ARM64 に移植するには、コードを C++ に変換するか、コンパイラの組み込みを使用するか、アセンブラー言語のソース ファイルを作成します。 Microsoft C++ コンパイラでは、特殊関数の命令 (特権、ビット スキャンまたはテスト、インタロックなど) を、可能な限りクロスプラットフォーム方式に近い形で使用できるようにするための組み込みがサポートされています。 使用可能な組み込みの詳細については、「コンパイラの組み込み」を参照してください。
アセンブラー言語ファイルを Visual Studio C++ プロジェクトに追加する
Visual Studio プロジェクト システムでは、C++ プロジェクトで MASM を使用して作成されたアセンブラー言語ファイルがサポートされています。 MASM では、x64 アセンブラー言語のソース ファイルを完全にサポートしていて、それらをオブジェクト ファイルに組み込みます。 その後、これらのオブジェクト ファイルを、x64 ターゲット用に構築された C++ コードにリンクさせることができます。 これは、x64 インライン アセンブラーの欠如を克服するための 1 つの方法です。
既存の Visual Studio C++ プロジェクトにアセンブラー言語ファイルを追加するには
ソリューション エクスプローラーでプロジェクトを選択します。 メニュー バーで、[プロジェクト]、[カスタマイズのビルド] の順に選択します。
[Visual C++ ビルド カスタマイズ ファイル] ダイアログボックスで、masm(.targets,.props) の横にあるチェックボックスをオンにします。 [OK] を選択して選択内容を保存し、ダイアログ ボックスを閉じます。
メニュー バーで、[プロジェクト]、[新しい項目の追加] の順に選択します。
[新しい項目の追加] ダイアログ ボックスの中央のペインで、[C++ ファイル (.cpp)] を選択します。 [名前] 編集コントロールで、
.cpp
ではなく.asm
拡張子を持つ新しいファイル名を入力します。 [追加] を選択して、ファイルをプロジェクトに追加し、ダイアログボックスを閉じます。
追加した .asm
ファイル内にアセンブラー言語コードを作成します。 ソリューションをビルドすると、MASM アセンブラーが呼び出されて、.asm
ファイルがオブジェクト ファイルにまとめられてから、それがプロジェクトにリンクされます。 シンボルへのアクセスを容易にするには、アセンブラー関数を、アセンブラー言語のソース ファイル内で C++ の名前装飾規則を使用して制限するのではなく、C++ ソース コード内で extern "C"
として宣言します。
ml64 固有のディレクティブ
x64 をターゲットとするアセンブラー言語のソース コードでは、次の ml64 固有のディレクティブを使用できます。
PROC
ディレクティブはまた、ml64.exe で使用できるように更新されました。
32 ビット アドレス モード (アドレス サイズのオーバーライド)
メモリ オペランドに 32 ビット レジスタが含まれている場合、MASM によって 0x67 アドレス サイズ オーバーライドが出力されます。 たとえば、次の例では、アドレス サイズ オーバーライドが出力されます。
mov rax, QWORD PTR [ecx]
mov eax, DWORD PTR [ecx*2+r10d]
mov eax, DWORD PTR [ecx*2+r10d+0100h]
prefetch [eax]
movnti rax, QWORD PTR [r8d]
32 ビットの変位がメモリ オペランドとして単独で表示される場合、MASM では 64 ビットのアドレス指定を想定しています。 現在、このようなオペランドを使用した 32 ビット アドレス指定はサポートされていません。
最後に、次のコードに示すように、メモリ オペランド内にレジスタ サイズを混在させると、エラーが生成されます。
mov eax, DWORD PTR [rcx*2+r10d]
mov eax, DWORD PTR [ecx*2+r10+0100h]