Ассемблера на C++ в Visual Studio 2013 с

Ассемблера на C++ в Visual Studio 2013 с

590
ПОДЕЛИТЬСЯ

Те, кто хочет быстро научиться применять сразу *.ASM и *.cpp файлы в проект, как вызывать способы из C++ в ассемблер и напротив, прошу под кат. Мысль данной статьи не новейшие, но так как мне пришлось издержать два дня на разбор всех ошибок компиляции и компоновки, а также отыскать ответы на свои вопросцы, решили , что читатели Хабра заслуживают того, чтоб сэкономить время.

Предисловие
Все началось с меня чтение публикации «ассемблер для Windows с помощью Visual Studio (с, следовательно, практически схожий код). Рассматриваются помощью Visual Studio 2005 и на 2013 год номер-Студио процесс похож, но есть несколько различий, которые сделают начинающий юзер длительное время, чтоб отыскать решения для всех заморочек со сборкой.

Содержание
ТЛ;ДР
Новейший проект
Настроить подсветку синтаксиса
Тонкости вызовов способов меж C++ и ASM
Приложение

ТЛ;ДР
Для тех, кому некогда читать: в конце статьи (в приложении) есть ссылка на готовый шаблон проекта и дополнения для подсветки синтаксиса.

Новейший проект
Иллюстрированная версиявключена в Visual Studio выберите файл -> сделать -> проект…:

Шаблон, который вы выберите Консольное Приложение Win32, а потом нажмите клавишу ОК:

Нажмите Клавишу Дальше:

Ставим галочку напротив пустой проект и нажмите клавишу «Готово»:

Чтоб сделать это, щелкните правой клавишей мыши на начальные файлы, выбрать добавить -> новейший элемент…: Сделать начальный код.

Выберите файл C++ и нажмите клавишу Добавить:

Аналогичным образом, сделать *.ASM-файл (просто поменять расширение файла в поле имя (заглавие):

Принципиально: имена файлов должны быть различными (не включая расширение), в неприятном случае при разработке файлов *.объект возникнет неувязка перезаписи 1-го объекта файла в иной.
Правой кнопкой мыши контекстное меню проекта выберите построения зависимостей -> опции сборки… Сейчас опции.

Ставим галочку напротив masm компа и нажмите клавишу ОК:

Сделать правый Клик на файле *.АСМ, выберите характеристики…:

Поле Тип элемента выберите макросов Microsoft ассемблер и нажмите клавишу ОК:

Выберите Проект -> Характеристики…:

Выберите Характеристики Конфигурации -> Макросов Microsoft Ассемблер -> Файл Листинга. Поле собранного кода листинг файла ввода $(имя проекта).лст:

Нажмите клавишу ОК: В сфере безопасного вида Обработчики исключений выберите значение нет. Выберите Характеристики Конфигурации -> Компоновщик -> Дополнительно.

На данный момент, проект может считаться установленным. Кодирование рассматривается в разделе тонкости вызовов способов меж C++ и ASM.

Лишь текствключают Visual Studio выберите файл -> сделать -> проект….
Шаблон, который вы выберите Консольное Приложение Win32, нажмите клавишу ОК.
Нажмите Клавишу Дальше.
Ставим галочку напротив пустой проект и нажмите клавишу Готово.
Сделать начальный код. Чтоб сделать это, щелкните правой клавишей мыши на начальные файлы, выбрать добавить -> новейший элемент….
Выберите файл C++ и нажмите клавишу Добавить.
Аналогичным образом, сделать *.ASM-файл (просто поменять расширение файла в поле имя).

Принципиально: имена файлов должны быть различными(не включая расширение), в неприятном случае при разработке файлов *.объект возникнет неувязка перезаписи 1-го объекта файла в иной.
Сейчас опции. Правой кнопкой мыши контекстное меню проекта выберите построения зависимостей -> опции сборки…
Ставим галочку напротив masm компа и нажмите клавишу ОК.
Сделать правый Клик на файле *.АСМ, выберите характеристики…
Поле Тип элемента выберите макросов Microsoft ассемблер и нажмите клавишу ОК.
Выберите Проект -> Характеристики…
Выберите Характеристики Конфигурации -> Макросов Microsoft Ассемблер -> Файл Листинга. Поле собранного кода листинг файла ввода $(имя проекта).лст.
Нажмите клавишу «ОК». В сфере безопасного вида Обработчики исключений выберите значение нет. Выберите Характеристики Конфигурации -> Компоновщик -> Дополнительно.
Кодирование рассматривается в разделе тонкости вызовов способов меж C++ и ASM. На данный момент, проект может считаться установленным.

Настроить подсветку синтаксиса
Есть аддон для Visual — asmHighlighter, но на момент написания статьи Версия для VS2013 не было. Опосля установки Visual пакет SDK, я был в состоянии выстроить проект и на данный момент *.пакет vsix находится в вольном доступе. Но, опосля просмотра дискуссий раздел, я нашел сообщение юзера Trass3r, которая, к счастью, общий репозиторий с версией аддона для VS2013.

Тонкости вызовов способов меж C++ и ASM
Для того, чтоб избежать ошибок компиляции и/либо привязки следует держать в голове:
Раз для вас необходимо позвонить ассемблер библиотека способов, довольно в начале участка кода, чтоб указать, какие способы мы будем применять.
EXTRN функции printf : Учеб ;мы будем применять функции printf

Потом вы сможете просто применять вызов:
;Е(В ebx,EAX версий)
с push еах;
толчок в ebx
вызов функции printf
добавить ЭСП, 8 ;поп-х2
1 еще написать как extern «с» перед определением способа. Раз для вас необходимо позвонить пользовательских способов, в дополнение к п.
модификатор extern «с»
отпадает* readName()
{
Тип char* имя = (типа char*)помощи calloc(1, 255);
функции scanf(«%с», наименование);
в то время как (getchar() != ‘п’);
возврат имя;
}

Соответственно, в *.ASM-файл:
EXTRN readName : Учеб ;и void* readName()
и
позвоните readName ;еах = readName()

В случае АСМ-способы в C++ нужно лишь указать макет:
модификатор extern «с»
{
в void sayhello () не;
}

Этот макет соответствует декларации АСМ-способа:
sayhello в прок

позвоните readName ;еах = readName()
Леа в ebx, helloFormat ;в ebx = &helloFormat

;Е(В ebx,EAX версий)
толчок в EAX
толчок в ebx
вызов функции printf
добавить ЭСП, 8 ;поп-х2

компания retn

sayhello в конечное
На самом деле, полный начальный код примера:

Source.cppв#define _CRT_SECURE_NO_WARNINGS
#включает <stdio.ч>
#включить <stdlib.ч>

модификатор extern «с»
{
в void sayhello () не;
}

силы главных()
{
функции printf(«Привет, как тебя зовут?н»);
sayhello () не;
в то время как (getchar() != ‘п’);
}
модификатор extern «с»
отпадает* readName()
{
Тип char* имя = (типа char*)помощи calloc(1, 255);
функции scanf(«%с», наименование);
в то время как (getchar() != ‘п’);
возврат имя;
}

AsmSource.АСМ -.686
.МОДЕЛЬ ПЛОСКАЯ, С
.Стек
.Данные
;————Локальные данные——————————
helloFormat б «Здрасти, %ы!», 10, 13, 0
.Код
;————Наружное внедрение—————————
EXTRN функции printf : Учеб;// мы будем применять функции printf
EXTRN readName : Учеб;//и void* readName()
;————Функция определения———————
sayhello в прок

позвоните readName; еах = readName()
Леа в ebx, helloFormat; в ebx = &helloFormat

;Е(В ebx,EAX версий)
толчок в EAX
толчок в ebx
вызов функции printf
добавить ЭСП, 8;поп-х2

компания retn

sayhello в конечное

Конец

Приложение
Готовый шаблон проекта можно отыскать тут. habrahabr.ru Пакет для подсветки АСМ синтаксис можно отыскать тут.