код ассемблера в visual studio
Assembler вместе с C++ в Visual Studio 2013
Предисловие
Началось все с прочтения мной публикации «Ассемблер для Windows используя Visual Studio» (отсюда и почти идентичный код). Там рассмотрено использование Visual Studio 2005, а для 2013-й студии процесс похожий, но есть несколько отличий, которые заставят неподготовленного пользователя долго искать решения всех проблем со сборкой.
Содержание
Для тех, у кого совсем нет времени на прочтение: в конце статьи (в приложении) есть ссылка на готовый шаблон проекта и на аддон для подсветки синтаксиса.
Создание проекта
Выбираем шаблон Win32 Console Application, кликаем ОК:
Ставим галочку напротив Empty project и жмем Finish:
Выбираем C++ File и жмем Add:
Аналогично, создаем *.asm файл (просто меняем расширение в поле Name):
Важно: имена файлов должны быть разными (не учитывая расширение), иначе при создании файлов *.obj возникнет проблема перезаписи одного обьектного файла другим.
Ставим галочку напротив masm и жмем ОК:
Делаем правый клик на файле *.asm, выбираем Properties. :
В поле Item Type выбираем Microsoft Macro Assembler и жмем ОК:
На этом этапе проект можно считать созданным. Написание кода рассмотрено в секции Тонкости вызова методов между С++ и Asm.
Выбираем шаблон Win32 Console Application, кликаем ОК.
Ставим галочку напротив Empty project и жмем Finish.
Выбираем C++ File и жмем Add.
Аналогично, создаем *.asm файл (просто меняем расширение в поле Name).
Важно: имена файлов должны быть разными(не учитывая расширение), иначе при создании файлов *.obj возникнет проблема перезаписи одного объектного файла другим.
Ставим галочку напротив masm и жмем ОК.
Делаем правый клик на файле *.asm, выбираем Properties.
В поле Item Type выбираем Microsoft Macro Assembler и жмем ОК.
На этом этапе проект можно считать созданным. Написание кода рассмотрено в секции Тонкости вызова методов между С++ и Asm.
Настройка подсветки синтаксиса
Существует аддон для Visual Studio — asmHighlighter, однако на момент написания статьи версии для VS2013 не существовало. Однако, просмотрев раздел Discussions, я нашел сообщение пользователя Trass3r, который, к счастью, поделился репозиторием с версией аддона для VS2013. После установки Visual Studio SDK мне удалось собрать проект и теперь *.vsix пакет есть в свободном доступе.
Тонкости вызова методов между С++ и Asm
Далее можно просто использовать call:
Соответственно, в *.asm файле:
и
Данный прототип соответствует такому объявлению Asm-метода:
Собственно, полный исходный код примера:
Приложение
Готовый шаблон проекта можно найти здесь.
Пакет для подсветки asm синтаксиса можно найти здесь.
Ассемблер для Windows используя Visual Studio
Многие из нас изучали ассемблер в университете, но почти всегда это ограничивалось простыми алгоритмами под DOS. При разработке программ для Windows может возникнуть необходимость написать часть кода на ассемблер, в этой статье я хочу рассказать вам, как использовать ассемблер в ваших программах под Visual Studio 2005.
Создание проекта
В статье мы рассмотрим как вызывать ассемблер из С++ кода и обратно, передавать данные, а также использовать отладчик встроенный в Visual Studio 2005 для отладки кода на ассемблер.
Для начала нам нужно создать проект. Включаем Visual Studio, выбираем File > New > Project. В Visual Studio нет языка ассемблер в окне выбора типа проекта, поэтому создаем С++ Win32 проект. В окне настроек нового проекта выбираем «Empty Project».
По умолчанию Visual Studio не распознает файлы с кодом на ассемблер. Для того чтобы включить поддержку ассемблер нам необходимо настроить в проекте условия сборки указав какой программой необходимо компилировать файлы *.asm. Для этого выбираем пункт меню «Custom Build Rules. ».
В открывшемся окне мы можем указать специальные правила компиляции для различных файлов, Visual Studio 2005 уже имеет готовое правило для файлов *.asm, нам необходимо лишь включить его, установив напротив правила «Microsoft Macro Assembler» галочку.
Добавление исходного кода
Перейдем к написанию исходного кода нашего проекта. Начнем с добавления исходного кода на c++. Добавим новый файл в папку Source Files. В качестве Template выбираем C++ File и вводим желаемое имя файла, например main.cpp. Напишем функцию, которая будет считывать имя введенное пользователем, оформив это в виде функции readName() которая будет возвращать ссылку на считанное имя. Мы получим примерно следующее содержимое файла:
Теперь, когда мы знаем имя пользователя мы можем вывести приветствие, его будет выводить функция sayHello() которую мы напишем на ассемблер, чтобы использовать эту функцию сначала мы должны указать что она будет определена в другом файле, для этого добавим блок к main.cpp:
Этот блок говорит компилятору, что функция sayHello() будет объявлена в другом файле и будет иметь правила вызова «C». Компилятор C++ искажает имена функций так, что указание правил вызова обязательно. Кроме того мы хотим использовать функцию readName() из функции sayHello(), для этого необходимо добавить extern «C» перед определением функции readName(), это позволит вызывать эту функцию из других файлов используя правила вызова «C».
Теперь мы можем запустить проект, для этого просто выбираем Debug > Start Without Debugging или нажимаем комбинацию Ctrl-F5. Если все сделано верно, вы увидите окно программы:
Немного усложним задачу, попробуем написать на ассемблер функцию принимающую параметр и возвращающую значение. Для примера напишем функцию calcSumm() которая будет принимать целое число и возвращать сумму его цифр. Изменим наш код на С++ добавив в него информацию о функции calcSumm, ввод числа и собственно вызов функции. Добавим функцию в файл hello.asm, возвращаемое значение помещается в eax, параметры объявляются после ключевого слова PROC. Все параметры можно использовать в коде процедуры, они автоматически извлекутся из стека. Также в процедурах можно использовать локальные переменные. Вы не можете использовать эти переменные вне процедуры. Они сохранены в стеке и удаляются при возврате из процедуры:
Запустив проект мы увидим следующий результат выполнения:
Отладка
Конечно в данной задаче нет ничего сложного и она вовсе не требует использования ассемблер. Более интересным будет рассмотреть, а что же нам дает Visual Studio для разработки на ассемблер. Попробуем включить режим отладки и установим точку остановки в hello.asm, запустим проект, мы увидим следующее:
Окно Disassembly (Debug > Windows > Disassembly) показываем команды ассемблер для данного объектного файла. Код который мы написали на С++ показывается черным цветом. Disassembled code показывается серым после соответствующего ему кода на C++/ассемблер. Окно Disassembly позволяет отлаживать код и осуществлять stepping по нему.
Окно регистров (Debug > Windows > Registers) позволяет посмотреть значение регистров.
Окно памяти (Debug > Windows > Memory) позволяет посмотреть дамп памяти, слева мы видим шестнадцатеричные адрес, справа шеснадцатеричные значения соответствующих ячеек памяти, можно перемещаться, вводя адрес в соответствующее поле в верху окна.
MASM для x64 (ml64.exe)
Visual Studio включает 32-разрядную и 64-разрядную версию Microsoft Assembler (MASM) для целевого кода x64. Именованный ml64.exe — это ассемблер, который принимает язык ассемблера x64. программы командной строки MASM устанавливаются при выборе рабочей нагрузки C++ во время установки Visual Studio. Средства MASM недоступны для загрузки отдельно. инструкции по загрузке и установке копии Visual Studio см. в разделе install Visual Studio. если вы не хотите устанавливать полнофункциональную интегрированную среду разработки Visual Studio, но вам нужны только программы командной строки, скачайте средства сборки для Visual Studio.
Чтобы использовать MASM для построения кода для платформ x64 в командной строке, необходимо использовать командную строку разработчика для целевых платформ x64, которые задают требуемый путь и другие переменные среды. Сведения о запуске командной строки разработчика см. в разделе Сборка кода C/C++ в командной строке.
сведения о ml64.exe параметров командной строки см. в разделе справочник по ML и ML64 Command-Line.
Встроенный ассемблер или использование ключевого слова ASM не поддерживается для целевых объектов x64 и ARM. Чтобы перенести код x86, использующий встроенный ассемблер для x64 или ARM, можно преобразовать код в C++, использовать встроенные функции компилятора или создать файлы исходного кода на языке ассемблера. Компилятор Microsoft C++ поддерживает встроенные функции, позволяющие использовать специальные инструкции, например привилегированные, битовые сканирования и тестирования, взаимоблокировки и т. д., в качестве максимально близкого к кросс-платформенному способу. Сведения о доступных встроенных функциях см. в разделе встроенные функции компилятора.
добавление файла ассемблерного языка в проект Visual Studio C++
система проектов Visual Studio поддерживает файлы на языке ассемблера, созданные с помощью MASM в проектах C++. Вы можете создавать файлы исходного кода на языке ассемблера x64 и создавать их в объектных файлах с помощью MASM, который поддерживает 64-разрядную версию. Затем эти файлы объектов можно связать с кодом C++, созданным для целевых платформ x64. Это один из способов преодоления отсутствия встроенного ассемблера x64.
добавление файла ассемблерного языка в существующий проект Visual Studio C++
Выберите проект в обозревателе решений. в строке меню выберите Project, настройки сборки.
в строке меню выберите Project, добавить новый элемент.
Создайте код на языке ассемблера в добавленном ASM-файле. При сборке решения вызывается ассемблер MASM Assembler для сборки ASM-файла в объектный файл, который затем связывается с проектом. Чтобы упростить доступ к символам, объявите функции ассемблера как extern «C» в исходном коде C++ вместо использования соглашений об оформлении имен c++ в исходных файлах на языке ассемблера.
Директивы, относящиеся к ml64
В исходном коде на языке ассемблера, предназначенном для x64, можно использовать следующие директивы ml64:
m_i_kuznetsov
Размышления о разработке программного обеспечения и информационных систем
То, что действительно важно, но чему нигде не учат
Речь пойдёт не о промежуточном коде IL, а об инструкциях процессора, сформированных JIT-компилятором.
В процессе отладки кода бывает необходимо проверить, во что превратился написанный программистом код. Например, для того, чтобы ответить, почему вроде бы корректный код приводит к потере производительности.
Если говорить об управляемом коде, например, коде C#, то есть целых три (!) стадии, где нужно проверять код при его оптимизации:
Сначала в VS создадим новый проект, например, консольное приложение на языке C#.
В файле Program.cs я напишу такой код:
namespace DasmInt
<
class Program
<
static void Main(string[] args)
<
int a = 4;
int b = 8;
int r;
r = a + b;
Console.WriteLine(«a + b = » + r);
Console.ReadLine();
>
>
>
Код просто объявляет три целочисленные переменные и затем складывает значения двух из них и записывает результат в третью. После этого код выводит в консоль результат сложения и ждёт реакции пользователя.
Теперь надо включить дизассемблирование. Для этого в меню выбираем команду Debug/Options или Tools/Options. В открывшемся окне настроек надо перейти в раздел Debugging/General. Затем нужно включить опцию Enable address-level debugging.
Теперь я поставлю точку прерывания (breakpoint) на объявлении первой переменной и запущу код на исполнение под отладчиком.
В момент объявления и инициализации переменной выполнение прервётся.
К этому моменту JIT-компилятор уже создал исполняемый машинный код, и мы можем его дизассемблировать и проверить.
Чтобы увидеть дизассемблированный код, нужно в меню Debug/Windows выбрать пункт Disassembly. Откроется окно с дизассемблированным кодом.
Обратите внимание, что в дизассемблированном коде имеются комментарии, указывающие на соответствующие фрагменты исходного кода. Это сильно упрощает навигацию по коду.
Кроме того, в дизассемблированном коде указана точка прерывания, т.е. строка кода, на котором было приостановлено выполнение программы. Вы можете в процессе отладки проверить выполнение кода ассемблера. Причём справа будет указываться, сколько времени затрачено на выполнение кода с момента прерывания.
Остаётся только напомнить, что код, который выполняется под отладчиком в VS, и код, который формируется JIT-компилятором при выполнении релизной версии, могут иметь существенные различия.
Ассемблер. Настройка среды разработки
Обновл. 16 Сен 2021 |
Язык ассемблера напрямую зависит от набора команд и архитектуры процессора. Для того, чтобы следовать данному руководству, вам понадобятся:
дистрибутив операционной системы Linux (например, Debian или Ubuntu);
копия программы ассемблера NASM.
Есть много хороших программ ассемблера, таких как:
Microsoft Assembler (MASM);
Borland Turbo Assembler (TASM);
The GNU assembler (GAS).
Мы будем использовать ассемблер NASM, так как он:
бесплатный. Вы можете скачать его c различных веб-ресурсов;
хорошо документированный. В Интернете вы сможете найти много информации по нему;
кроссплатформенный. Его можно использовать как на Linux, так и на Windows.
Установка NASM
Если при установке Linux вы устанавливали «Инструменты разработки», то NASM у вас уже установлен. Чтобы проверить, установлен ли у вас NASM, выполните следующие действия:
введите команду whereis nasm и нажмите ENTER.
Если он у вас установлен, то вы увидите примерно следующее:
Если же вы увидели:
То NASM у вас не установлен, и его потребуется установить.
Чтобы установить NASM, выполните следующие шаги:
Редактор Visual Studio Code
Я рекомендую установить универсальный редактор кода Visual Studio Code. Он позволит вам не только удобно писать на ассемблере под Linux, но и на других языках.
Для установки вам нужно перейти на официальный сайт Microsoft Visual Studio Code, пролистать страницу вниз и скачать версию .deb:
После того, как VS Code будет установлен, вам нужно будет:
нажать комбинацию клавиш Ctrl+P ;
Поделиться в социальных сетях: