2015-01-22 9 views
1

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

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

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

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 

Когда я пытаюсь построить его (я иду к проекту и выберите «Консоль Собирают и Link») Я получаю следующее сообщение об ошибке:

AddSubAlt.obj : error LNK2001: unresolved external symbol [email protected] 
AddSubAlt.obj : error LNK2001: unresolved external symbol [email protected] 
AddSubAlt.exe : fatal error LNK1120: 2 unresolved externals 

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

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

+1

Вы должны добавить соответствующие файлы '.lib' в командную строку компоновщика для библиотек, из которых вы берете' ExitProcess' и 'DumpRegs'. Кстати, зачем вызывать 'ExitProcess', когда вы можете просто нуля' eax' и 'retn'? – Ruslan

+0

или в коде сборки, вы можете добавить directelves includeelib., Такие как | INCLUDELIB MSVCRTD | | INCLUDELIB OLDNAMES | , – rcgldr

+0

@ Ruslan Если вы спрашиваете меня, почему г-н Ирвин написал код таким образом, я не мог ответить вам. Я также не понимаю, как делать то, что вы сказали. –

ответ

2

Прежде всего, необходимо библиотечные файлы Ирвина (kernel32.lib, User32.Lib, Irvine32.lib, Irvine32.inc), которые можно загрузить с his site, то есть загрузить этот файл и установить его: 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... -линии для последующего использования и закомментирована сейчас.

+0

Спасибо! Интересно, почему он не упомянул об этом в своем коде. Просто из любопытства, в чем разница между .inc и .Lib? –

+1

@Choirbean: '.inc' -файл - это текст, который вставляется ассемблером в том месте, где его' include' - как будто вы набрали его лично. '.lib'-файлы являются функциональными библиотеками для компоновщика, так что он знает, что делать с вызовом внешней функции (например, DumpRegs и ExitProcess). – rkhb

+0

Еще раз спасибо за то, что так полезно! –

1

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

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

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 

 Смежные вопросы

  • Нет связанных вопросов^_^