Ассемблер

Как писать на ассемблере в Visual Studio

Чтобы писать на ассемблере в Visual Studio, обычно используют MASM — Microsoft Macro Assembler. Он входит в Visual Studio или Build Tools вместе с C++ workload. Самый удобный путь для новичка: создать C++ проект, добавить .asm-файл, настроить его сборку через MASM и вызвать ассемблерную процедуру из C/C++

Что установить

Откройте Visual Studio Installer и убедитесь, что установлен компонент:

Desktop development with C++

Для 64-битного ассемблера используется ml64.exe, для 32-битного — ml.exe. Эти инструменты относятся к MASM

Не скачивайте MASM из случайных архивов. Актуальный безопасный путь — Visual Studio или Build Tools for Visual Studio

Как добавить .asm-файл

В C++ проекте:

  1. Нажмите правой кнопкой по проекту.
  2. Выберите Add -> New Item.
  3. Создайте файл, например sum.asm.
  4. Откройте свойства файла.
  5. Укажите, что он должен собираться MASM или через Custom Build Tool, если шаблон проекта не сделал это сам.

В некоторых версиях Visual Studio нужно включить MASM для проекта через Build Customizations:

Project -> Build Customizations -> masm

Пример идеи

В .asm можно написать процедуру:

.code
AddTwo PROC
    mov eax, ecx
    add eax, edx
    ret
AddTwo ENDP
END

Для x64 Windows первые целочисленные аргументы часто приходят в rcx, rdx, r8, r9; для 32-битного кода правила другие. Поэтому важно понимать разрядность проекта и соглашение вызова

В C++ можно объявить функцию:

extern "C" int AddTwo(int a, int b);

И вызвать ее как обычную функцию

32-bit и 64-bit

В Visual Studio это принципиально:

  • x86 использует 32-битный код и ml.exe;
  • x64 использует 64-битный код и ml64.exe;
  • регистры, соглашения вызова и доступные возможности отличаются.

Если пример из интернета не собирается, сначала проверьте, под какую разрядность он написан

Почему не стоит начинать с inline asm

В старых 32-битных C++ проектах встречался inline asm. Но для x64 в Visual Studio inline asm в C++ не поддерживается так же, как раньше. Поэтому чаще используют отдельный .asm-файл и MASM

Частые ошибки

Не установлен C++ workload

Без C++ toolchain Visual Studio может не иметь нужных MASM-инструментов

.asm-файл не участвует в сборке

Файл может лежать в проекте, но не собираться. Проверьте свойства файла и Build Customizations

Путают NASM и MASM

MASM-синтаксис отличается от NASM. Пример для NASM не обязан собираться в Visual Studio

Не учитывают calling convention

Если регистры аргументов выбраны неверно, функция вернет мусор или сломает программу

Что почитать дальше по ассемблеру

Если нужен общий маршрут по теме, откройте рубрику ассемблеру. Для соседних задач пригодятся эти разборы:

Как проверить результат на практике

Для ассемблера важно сначала понять, под какую среду написан пример: DOSBox/TASM, Linux x64/NASM, Visual Studio/MASM или микроконтроллер. Один и тот же смысл может записываться разным синтаксисом, поэтому не переносите команды между средами вслепую. Создайте отдельную папку для примера, сохраните файл с расширением .asm, выполните сборку именно тем инструментом, который указан в уроке, и сравните вывод или состояние регистров с ожидаемым результатом

Если пример не собирается, читайте первую ошибку ассемблера: обычно она указывает на строку, неизвестную инструкцию, неверную метку, неправильную секцию или конфликт синтаксиса. Исправляйте одну ошибку за раз. В ассемблере это особенно важно, потому что маленькая опечатка в метке, регистре или размере операнда может полностью изменить поведение программы

Подписаться
Уведомить о
guest
0 комментариев
Старые
Новые Популярные

Настройки cookie

0
Оставьте комментарий! Напишите, что думаете по поводу статьи.x