MASM for x64 (ml64.exe)

Visual Studio 包括 32 位和 64 位托管版本的 MASM(Microsoft 宏汇编程序),面向 x64 代码。 它的名称为 ml64.exe,是接受 x64 汇编程序语言的汇编程序。 当你在 Visual Studio 安装期间选择 C++ 工作负荷时,会安装 MASM 命令行工具。 MASM 工具不可单独下载。 有关如何下载并安装 Visual Studio 副本的说明,请参阅安装 Visual Studio。 如果只需要命令行工具,而不需要完整的 IDE,请下载 Visual Studio 生成工具

若要在命令行上使用 ml64.exe,请启动适用于 x64 目标的开发人员命令提示符。 开发人员命令提示符会设置所需的路径和其他环境变量。 若要了解如何启动开发人员命令提示符,请参阅在命令行上生成 C/C++ 代码

有关 ml64.exe 命令行选项的信息,请参阅 ML 和 ML64 命令行参考

x64 或 ARM64 目标不支持内联汇编程序,也不支持使用 ASM 关键字。 若要将使用内联汇编程序的 x86 代码移植到 x64 或 ARM64,可以将代码转换为 C++、使用编译器内部函数或创建汇编程序语言源文件。 Microsoft C++ 编译器支持内部函数,允许你以尽可能接近跨平台方式的方式使用特殊函数指令,例如特权、位扫描或测试、互锁等。 有关可用内部函数的信息,请参阅编译器内部函数

将汇编程序语言文件添加到 Visual Studio C++ 项目

Visual Studio 项目系统支持在 C++ 项目中使用 MASM 生成的汇编程序语言文件。 MASM 完全支持 x64 汇编程序语言源文件,并将其生成到对象文件中。 然后,你可以将这些对象文件链接到为 x64 目标生成的 C++ 代码。 这是克服缺少 x64 内联汇编程序的一种方法。

将汇编程序语言文件添加到现有 Visual Studio C++ 项目的步骤

  1. 在解决方案资源管理器中,选择项目。 在菜单栏上选择“项目”、“生成自定义”

  2. 在“Visual C++ 生成自定义文件”对话框中,选中 masm(.targets,.props) 旁边的复选框。 选择“确定”以保存你的选择并关闭对话框。

  3. 在菜单栏上,依次选择“项目”、“添加新项”。

  4. 在“添加新项”对话框的中心窗格中,选择“C++ 文件(.cpp)”。 在“名称”编辑控件中,输入扩展名为 .asm 而非 .cpp 的新文件名。 选择“添加”以将文件添加到项目并关闭对话框。

在添加的 .asm 文件中创建汇编程序语言代码。 生成解决方案时,将调用 MASM 汇编程序以将 .asm 文件汇编成一个对象文件,然后将其链接到项目中。 若要简化符号访问,请在 C++ 源代码中将汇编程序函数声明为 extern "C",而不是在汇编程序语言源文件中使用 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]

另请参阅

Microsoft 宏汇编程序参考