x64 用 MASM (ml64.exe)
ml64.exe は、x64 アセンブリ言語対応のアセンブラーです。 ml64.exe コンパイラ オプションについては、「ML および ML64 のコマンド ライン リファレンス」を参照してください。
インライン ASM は x64 ではサポートされていません。 MASM またはコンパイラの組み込み機能 (x64 Intrinsics) を使用してください。
この 2 つの代替手段は、MASM (x64 を完全サポート) とコンパイラの組み込み機能を使用した別々のアセンブリです。 多数の組み込み機能が追加され、密接なプラットフォーム間の連携を実現する、特殊な関数命令 ( 特権、ビット スキャン/テスト、インタロックなど) が利用できるようになりました。
ml64 固有のディレクティブ
ml64.exe では以下のディレクティブを使用します。
また、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]
MASM では、32 ビット配置が唯一のメモリ オペランドになっている場合、64 ビット アドレス指定が指定されているものとされます。 現在、このオペランドでの 32 ビット アドレス指定はサポートされていません。
結果、以下のコードで示されているように、1 つのメモリ オペランド内に複数のレジスタ サイズが混在し、エラーが発生します。
mov eax, DWORD PTR [rcx*2+r10d]
mov eax, DWORD PTR [ecx*2+r10+0100h]