2013-03-26 2 views
2

Скачал и экстрагируют MASM32 + в SDK со следующего веб-сайта: http://www.masm32.com/masmdl.htmmasm32 - «Нерешенные внешние символы» с подчеркиванием, а связывающие

я затем компилируется и связаны следующую программу с помощью ml.exe и link.exe:

.386 
.model flat, stdcall 

; Windows libraries 
includelib \masm32\lib\kernel32.lib 
includelib \masm32\lib\user32.lib 
extrn [email protected] : PROC 
extrn [email protected] : PROC 

option casemap:none ; Treat labels as case-sensitive 

.DATA   ; Begin initialized data segment 
    ProgramTitle db "Hello, puny humans!", 0 ; define byte 
    DisplayText db "Wahahaha", 0 

.CODE   ; Begin code segment 
_main PROC 

    push 0 
    mov eax, offset ProgramTitle 
    push eax 
    push offset DisplayText 
    push 0 

    call [email protected] 
    call [email protected] 

    ret 
_main ENDP 

END 

командной строки:

ml /c test.asm 
link /entry:_main /subsystem:windows test.obj 

Выход:

ml /c test.asm 
    Assembling: test.asm 

link /entry:_main /subsystem:windows test.obj  
    test.obj : warning LNK4033: converting object format from OMF to COFF 
    test.obj : error LNK2001: unresolved external symbol [email protected] 
    test.obj : error LNK2001: unresolved external symbol [email protected] 
    test.exe : fatal error LNK1120: 2 unresolved externals 

Попытка запустить DUMPBIN на файл .obj: (. Ml.exe v 6,14)

Dump of file test.obj 
test.obj : warning LNK4048: Invalid format file; ignored 

    Summary 

Это кажется странным, что я не могу связать файлы, использующие функциональные возможности по умолчанию MASM32 и библиотеки, которые включены в комплект поставки.

+2

Если вы используете MASM32 нет никакой необходимости использовать неудобный синтаксис как 'EXTRN MessageBoxA @ 16: MessageBoxA PROC' /' вызов @ 16'. Вы могли бы просто включить user32.inc и сделать 'invoke MessageBoxA NULL, ADDR DisplayText, ADDR ProgramTitle, NULL' – Michael

ответ

2

Программа должна быть скомпилирована с опцией/coff. мл 6.14 по умолчанию соответствует OMF. Это является причиной как DUMPBIN отказа в файл (он принимает только COFF) и предупреждение линкер «преобразование формата объекта из OMF в COFF»:

ml /c /coff test.asm 

Выход DUMPBIN отражает это:

File Type: COFF OBJECT 

    Summary 

     1D .data 
     48 .drectve 
     1A .text 

И никакого вывода от компоновщика, кроме test.exe и уведомлений об авторских правах Microsoft.

Примечание:

ml.exe 6,14 составляет около 20 лет. (Wikipedia)

Версии 7.0+ в комплекте с средой разработки Visual C++. Версии 8.0+ находятся под определенными ограничениями: (masm32.com)

«Версии 7.0 и выше являются компонентами Microsoft Visual C++ среды развития, а также были доступны в ряде комплектов разработки устройств для последовательных версий Microsoft Windows. Версия 8.0 и более поздняя версия доступны в виде бесплатных загрузок от Microsoft в соответствии с EULA, что ограничивает использование бесплатных версий для разработки кода для операционных систем Microsoft ».

MASM 8.0 доступен здесь: http://www.microsoft.com/en-us/download/details.aspx?id=12654

1

EXTRA Примечание с 6.14,

ml.exe будет игнорировать параметр/растворите в этом случае

ml test.asm /c /coff 
(странный вопрос.)

ml.exe принимает во внимание параметр/coff.

ml /c /coff test.asm 
+1

Возможно, это потому, что это синтаксис:' ML [/ options] filelist [/ link linkoptions] ' – Daan

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