Ошибка компиляции MASM32

Я пытаюсь использовать masm32, чтобы узнать о сборке. Я использую Windows 8 и могу без проблем скомпилировать и запустить пример кода в каталоге masm32.

Я использую Quick Editor 4.0g.

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

TITLE Add and Subtract

; This program add and subtracts 32-bit Integers

.386
.model flat,stdcall
.stack 4096
ExitProcess PROTO, dwExitCode:DWORD
DumpRegs PROTO

.code
main PROC

    mov eax,10000h
    add eax,40000h
    sub eax,20000h
    call    DumpRegs

INVOKE ExitProcess,0
main ENDP
END main

Когда я пытаюсь его собрать (я захожу в проект и выбираю "Консольная сборка и связь"), я получаю следующую ошибку:

AddSubAlt.obj : error LNK2001: unresolved external symbol _ExitProcess@4
AddSubAlt.obj : error LNK2001: unresolved external symbol _DumpRegs@0
AddSubAlt.exe : fatal error LNK1120: 2 unresolved externals

Я пытался понять это в течение нескольких дней. Я нашел ответ от 2002 года, но он ссылается на библиотеки, которых больше не существует. Я надеюсь, что какой-нибудь ангел-гуру сборки поможет мне это исправить.

Пожалуйста и спасибо вам!


person Ben I.    schedule 22.01.2015    source источник
comment
Вы должны добавить соответствующие файлы .lib в командную строку компоновщика для библиотек, из которых вы берете ExitProcess и DumpRegs. Кстати, зачем вызывать ExitProcess, когда можно просто обнулить eax и retn?   -  person Ruslan    schedule 22.01.2015
comment
или в ассемблерный код можно добавить директивы includelib, например | ВКЛЮЧИТЬ МСВКРТД | | ВКЛЮЧИТЬ СТАРЫЕ НАЗВАНИЯ | .   -  person rcgldr    schedule 22.01.2015
comment
@Ruslan Если вы спрашиваете меня, почему мистер Ирвин написал код таким образом, я не могу вам ответить. Я тоже не очень понимаю, как сделать то, что вы сказали.   -  person Ben I.    schedule 22.01.2015
comment
@rcgldr, не могли бы вы рассказать мне, что мне нужно делать маленькими шажками? Я новичок в сборке.   -  person Ben I.    schedule 22.01.2015


Ответы (2)


Сначала вам потребуются файлы библиотеки Irvine (Kernel32.Lib, User32.Lib, Irvine32.lib, Irvine32.inc), которые вы можете загрузить с его сайт, т.е. скачайте этот файл и установите его: http://www.kipirvine.com/asm/examples/Irvine_7th_Edition.msi.

Теперь вы вставляете несколько строк в начале вашей программы:

includelib C:\full\path\to\Kernel32.Lib
includelib C:\full\path\to\User32.Lib
includelib C:\full\path\to\Irvine32.lib

; include C:\full\path\to\Irvine32.inc

Строка include... предназначена для дальнейшего использования и пока закомментирована.

person rkhb    schedule 22.01.2015
comment
Спасибо! Интересно, почему он не упомянул об этом в своем коде. Просто из любопытства, в чем разница между .inc и .Lib? - person Ben I.; 22.01.2015
comment
@Choirbean: .inc-файл - это текст, который вставляется ассемблером в то место, где находится его include, как если бы вы набрали его лично. .lib-файлы — это библиотеки функций для компоновщика, чтобы он знал, что делать с вызовом внешней функции (например, DumpRegs и ExitProcess). - person rkhb; 22.01.2015
comment
Еще раз спасибо за такую ​​помощь! - person Ben I.; 22.01.2015

Предполагается, что примеры программ в книге Ирвина будут запускаться в MS Visual Studio, где вы настраиваете библиотеку и включаете пути через графический интерфейс.

Если вы хотите собрать через командную строку, вам нужно будет указать путь к библиотеке через аргументы команды. Ниже приведен пример, который работал для меня.

C:\Users\QMPH64>"C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\bin\ml.exe" /I C:\Irvine\ C:\Irvine\Examples\ch03\AddSubAlt.asm /link /SUBSYSTEM:CONSOLE /LIBPATH:C:\Irvine\

Или, в качестве альтернативы, вы можете предоставить отдельные библиотеки в командной строке следующим образом.

C:\Users\QMPH64>"C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\bin\ml.exe" /I C:\Irvine\  AddSub.asm /link C:\Irvine\Irvine32.lib C:\Irvine\kernel32.lib C:\Irvine\User32.Lib /SUBSYSTEM:CONSOLE
person Saad    schedule 24.06.2016