Компиляция сборки в Visual Studio
Как скомпилировать код сборки с помощью 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
настройку сборки masm.targets
(щелкните правой кнопкой мыши проект> Построить настройки..), но безрезультатно.
Ответы
Ответ 1
Мне кажется, что пользовательские правила сборки для файлов .asm не включены. Щелкните правой кнопкой мыши проект, пользовательские правила сборки, отметьте "Microsoft Macro Assembler". С директивой "END clear" и отключением инкрементной привязки я получаю чистую сборку.
Он отличается от VS2010:
- Щелкните правой кнопкой мыши Проект, Настроить настройки, отметьте " masm".
- Щелкните правой кнопкой мыши файл
.asm
, Свойства, измените Тип элемента на Макросборник Microsoft.
Ответ 2
Командная строка:
Скомпилируйте код с помощью
ml /c /Cx /coff code.asm
В качестве вывода вы получите код .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 (не решено)
Ответ 3
В Visual Studio включен макросмастер MASM. Меньшие фрагменты кода ассемблера часто записываются в встроенная сборка в программе на C или С++.
Чтобы интегрировать файл ассемблера в проекте Visual Studio, создайте обычный проект C/С++ (командная строка или графический интерфейс) и просто добавьте файл, заканчивающийся на .asm
, в список исходных файлов.
Чтобы указать как точку входа, выполните следующие инструкции:
-
Откройте страницу свойств проекта
диалоговое окно. Для получения дополнительной информации см. настройка
Свойства проекта Visual С++.
-
Щелкните папку Linker.
-
Перейдите на страницу Дополнительные свойства.
-
Измените свойство Entry Point.
(Это было взято из документации Visual Studio.)
Я могу подтвердить инструкцию Hans Passant. Кроме того, согласно в этой статье, если вы сначала добавите флажок "настроить настройки" masm, а затем добавьте файл, он автоматически будет признанный как файл ассемблера. Кроме того, не указывать имя точки входа в директиве END, но вместо этого указывать его в настройках проекта также работает для меня.
Ответ 4
Проблема заключается в том, что ваш код сборки является просто функцией. Чтобы скомпилировать и связать ссылку, вам нужно иметь процедуру запуска, как и Main
в C/С++. Вы можете указать символ начала, указав в своей директиве END
. Как:
END clear
Или, если вы хотите, вы можете связать файл .obj, сгенерированный сгенерированным Cob С++.obj.