Компиляция сборки в Visual Studio - PullRequest
51 голосов
/ 28 декабря 2010

Как вы компилируете ассемблерный код с помощью Visual Studio?

Я хочу скомпилировать и запустить исходный файл сборки в Visual Studio 2010 .

Я создал проект Visual C ++ и вставил несколько ассемблерных кодов в файл code.asm:

.586              ;Target processor.  Use instructions for Pentium class machines
.MODEL FLAT, C    ;Use the flat memory model. Use C calling conventions
.STACK            ;Define a stack segment of 1KB (Not required for this example)
.DATA             ;Create a near data segment.  Local variables are declared after
                  ;this directive (Not required for this example)
.CODE             ;Indicates the start of a code segment.

clear PROC
   xor eax, eax 
   xor ebx, ebx 
   ret 
clear ENDP 
END

Однако проблема в том, что когда вы пытаетесь скомпилировать это, вы получаете:

LINK : error LNK2001: unresolved external symbol _mainCRTStartup

Я пошел и включил настройку сборки masm.targets (щелкните правой кнопкой мыши проект> Настройки сборки ..), но безрезультатно.

Ответы [ 5 ]

61 голосов
/ 29 декабря 2010

Похоже, что пользовательские правила сборки для файлов .asm не включены. Щелкните правой кнопкой мыши по проекту, Custom Build Rules, отметьте «Microsoft Macro Assembler». С директивой «END clear» и отключением инкрементного связывания я получаю чистую сборку.

Это отличается от VS2010 :

  1. Щелкните правой кнопкой мыши Проект , Создание настроек , отметьте " masm ".
  2. Щелкните правой кнопкой мыши файл .asm, Свойства , измените Тип элемента на " Microsoft Macro Assembler ".
11 голосов
/ 29 декабря 2010

Командная строка:

Скомпилируйте код с помощью:

ml /c /Cx /coff code.asm

В качестве вывода вы получите code.obj.

Ссылка с:

link code.obj /SUBSYSTEM:console /out:go.exe /entry:clear

Теперь вы можете запустить go.exe.

В качестве альтернативы, сделать все это за один раз с помощью:

ml /Cx /coff code.asm /link /SUBSYSTEM:console /link /entry:clear

Visual Studio (не решена)

9 голосов
/ 28 декабря 2010

Visual Studio включает макроассемблер MASM . Меньшие фрагменты ассемблерного кода часто пишутся в встроенной сборке в программе на C или C ++.

Чтобы интегрировать файл ассемблера в проект Visual Studio, создайте обычный проект C / C ++ (командная строка или графический интерфейс) и просто добавьте файл, заканчивающийся .asm, в список исходных файлов.

Чтобы указать очистку в качестве точки входа, выполните следующие инструкции:

  1. Открыть страницы свойств проекта диалоговое окно. Для получения дополнительной информации см. Настройка Свойства проекта Visual C ++.

  2. Щелкните папку Linker.

  3. Щелкните по странице свойств Advanced.

  4. Изменение свойства точки входа.

(взято из документации Visual Studio .)

Я могу подтвердить инструкцию Ганса Пассанта. Кроме того, согласно этой статье , если вы сначала добавите флажок «сборка настроек», а затем добавите файл, он автоматически будет распознан как файл ассемблера. Более того, мне не нужно указывать имя точки входа в директиве END, а указывать его в настройках проекта.

1 голос
/ 20 марта 2019

вот как скомпилировать исходный код сборки nasm с vs20xx:

  1. «Исключен из сборки» в «Нет»

  2. »ЭлементВведите "to" Инструмент пользовательской сборки "

  3. Применить удар

  4. Инструмент пользовательской сборки -> Общие -> Командная строка:

    c: \ nasm \ nasm -f win64 my_asm.asm

  5. Пользовательский инструмент сборки -> Общие -> Выходы:

    my_asm.obj

  6. вызвать функцию следующим образом:

    extern "C" int foo (void);// написано в сборке!

https://www.cs.uaf.edu/2017/fall/cs301/reference/nasm_vs/

учебник по назму:

http://cs.lmu.edu/~ray/notes/nasmtutorial/

0 голосов
/ 29 декабря 2010

Проблема в том, что ваш ассемблерный код - это просто функция.Чтобы скомпилировать и связать, вам нужна процедура запуска, подобная Main в C / C ++.Вы можете указать начальный символ, указав в своей директиве END.Например:

END clear

Или, если хотите, вы можете связать файл .obj, созданный на C / C ++ .obj one.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...