Поделиться через


MASM для x64 (ml64.exe)

Visual Studio включает как 32-разрядную, так и 64-разрядную размещенные версии MASM (сборщик макросов Майкрософт) для целевого кода x64. Именованный ml64.exe, это сборщик, принимаюющий язык сборщика x64. Средства командной строки MASM устанавливаются при выборе рабочей нагрузки C++ во время установки Visual Studio. Средства MASM недоступны в виде отдельной загрузки. Инструкции по скачиванию и установке копии Visual Studio см. в разделе "Установка Visual Studio". Если вам нужны только средства командной строки, а не полная интегрированная среда разработки, скачайте средства сборки для 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 поддерживает файлы языка сборщика, созданные с помощью MASM в проектах C++. MASM полностью поддерживает исходные файлы на языке сборки x64 и создает их в файлы объектов. Затем эти файлы объектов можно связать с кодом C++, созданным для целевых объектов x64. Это один из способов преодолеть отсутствие встроенного сборщика x64.

Добавление файла на языке сборки в существующий проект Visual Studio C++

  1. Выберите проект в обозревателе решений. В строке меню выберите "Проект", "Сборка настроек".

  2. В диалоговом окне "Файлы настройки сборки Visual C++" установите флажок рядом с masm(.targets,.props). Нажмите кнопку "ОК ", чтобы сохранить выделение и закрыть диалоговое окно.

  3. В строке меню выберите "Проект", "Добавить новый элемент".

  4. В диалоговом окне "Добавление нового элемента" выберите файл C++ (.cpp) в центральной области. В элементе управления "Изменение имени" введите новое имя файла с расширением .asm вместо .cppнего. Нажмите кнопку "Добавить", чтобы добавить файл в проект и закрыть диалоговое окно.

Создайте код на языке сборки в добавленном .asm файле. При сборке решения вызывается сборщик MASM для сборки .asm файла в файл объекта, который затем связан с проектом. Чтобы упростить доступ к символам, объявите функции сборщика как extern "C" в исходном коде C++ вместо использования соглашений об оформлении имен C++ в исходных файлах на языке сборщика.

Директивы ml64-specific

В исходном коде для сборщика можно использовать следующие директивы ml64, предназначенные для x64:

Директива PROC также была обновлена для использования с ml64.exe.

32-разрядный режим адреса (переопределение размера адреса)

MASM выдает переопределение размера адреса 0x67, если операнда памяти содержит 32-разрядные регистры. Например, в следующих примерах размер адреса переопределяется:

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 предполагает 64-разрядную адресацию, если 32-разрядное смещение появляется только в качестве операнда памяти. В настоящее время нет поддержки 32-разрядной адресации с такими операндами.

Наконец, сочетание размеров регистров в операнде памяти, как показано в следующем коде, создает ошибку.

mov eax, DWORD PTR [rcx*2+r10d]
mov eax, DWORD PTR [ecx*2+r10+0100h]

См. также

Справочные материалы по ассемблеру Microsoft Macro Assembler