Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Asm для начинающих > Проблемы с MASM


Автор: Proger89 13.12.2007, 19:11
Возникла не понятная проблема с компиляцией и сборкой программы под MASM ( раньше я все делал в Tasm-e).
Никак не могу найти нужные ключи для компиляции и сборки программы под Win32. Вот программа(Название исходника - "test.asm"):

Код


.386
.model    flat, stdcall
.stack 4096
ExitProcess proto , dwExitCode : dword

.code
Main proc
        
    mov    eax, 100h
    add    eax, 50
    sub    eax, 56

    invoke ExitProcess, 0

Main endp


end    Main


Я пишу ml -c test.asm и link test. 
Вывод в консоли:
LINK: Fatal Error LNK1561: entry point must be defined

Помогите пожалуйста кто может. Заранее благодарен.

Автор: anwe 13.12.2007, 21:31
Цитата(Proger89 @  13.12.2007,  18:11 Найти цитируемый пост)
entry point must be defined

Точка входа не определена.
Прописан прототип функции, обращение к ней, а где она сама?? Нет точки входа в ExitProcess. Добавь саму функцию:
Код

ExitProcess proc paramert1:DWORD
...
ExitProcess endp

Автор: MAKCim 13.12.2007, 22:53
anwe, 
вообще насколько я знаю ExitProcess - это API функция Windows, определенная где-то в DLL

Автор: anwe 13.12.2007, 23:03
MAKCim, а посмотри, здесь нет подключение библиотек. В этом коде автор использует свою интерпретацию этой функции, которую может назвать как хочет. Это также косвенно подтверждается словами:
Цитата(Proger89 @  13.12.2007,  18:11 Найти цитируемый пост)
( раньше я все делал в Tasm-e)

Автор: MAKCim 13.12.2007, 23:15
Цитата(anwe @  13.12.2007,  23:03 Найти цитируемый пост)
MAKCim, а посмотри, здесь нет подключение библиотек

а на этапе компиляции и не надо ничего подключать
библиотека необходима для компоновки объектных файлов
кроме того, как видишь, ошибки типа
Цитата

Unresolved external symbol

тут явно нет

Автор: anwe 13.12.2007, 23:28
Но ведь ошибка линковщика
Цитата(Proger89 @  13.12.2007,  18:11 Найти цитируемый пост)
LINK: Fatal Error LNK1561: entry point must be defined

а он проводит же компановку, используя таблицу имен.
А ошибка все-таки в этом: нет входа в нужную процедуру, так как она и не описана.

Автор: dumb 14.12.2007, 04:40
Код

; сборка:
; ml -c -coff test.asm
; link /SUBSYSTEM:WINDOWS test.obj
.386
.model    flat, stdcall
option casemap :none
;.stack 4096 ;- нафиг не нужно
;ExitProcess proto , dwExitCode : dword ;- не ищем легких путей?
include \MASM32\INCLUDE\windows.inc
include \MASM32\INCLUDE\kernel32.inc
includelib \MASM32\LIB\kernel32.lib
.code
Main proc
        
    mov    eax, 100h
    add    eax, 50
    sub    eax, 56
    invoke ExitProcess, 0
Main endp
end    Main


Цитата(anwe @  13.12.2007,  23:28 Найти цитируемый пост)
А ошибка все-таки в этом: нет входа в нужную процедуру, так как она и не описана.
вообще-то, он ругается не на "вход в нужную процедуру", а на отсутствие точки входа в программу(entry point). а найти он ее не смог из-за неверного формата obj(link пытается преобразовать, но не особо успешно), который выдал ml.

Автор: anwe 15.12.2007, 23:27
Это-то верно. Но можно не использовать inc'и и вышеописанный код также верный. К тому же автор ранее пользовался Tasm'ом. Другими словами этот код тоже верный:
Код

.386
.model    flat, stdcall
.stack 4096
ExitProcess proto , dwExitCode : dword

.code
Main proc
        
    mov    eax, 100h
    add    eax, 50
    sub    eax, 56

    invoke ExitProcess, 0

Main endp

ExitProcess proc dwExitCode : dword
mov eax,dwExitCode; просто первое, что пришло а голову
ExitProcess endp

end    Main

Автор: dumb 16.12.2007, 04:12
anwe, что ты пытаешься доказать? и какой смысл в приведенном тобой, уж прости, бредовом коде? smile

Автор: MAKCim 16.12.2007, 10:34
anwe, 
может он и верный, но делает он не то, что хотел Proger89

Автор: anwe 16.12.2007, 10:51
Неужели обязательно надо назвать функцию WinMain, чтобы дать понять, что можно и так написать?

Автор: MAKCim 16.12.2007, 10:55
Цитата(anwe @  16.12.2007,  10:51 Найти цитируемый пост)
Неужели обязательно надо назвать функцию WinMain, чтобы дать понять, что можно и так написать? 

в вашем коде есть вызов API-функции завершения процесса?  smile 

Автор: Proger89 22.12.2007, 23:53
Извините, что долго не отвечал, не работал Интернет.
За этот промежуток времени я уже успел исправить ошибку. ExitProcess - WinAPI функция, для коректной работы нужно было подключить библиотеку kernel32.lib, тоесть дописать:
Код

includelib kernel32.lib


а потом запустить следуюший bat-ник:

Код

\masm32\bin\ml /c /coff /nologo *.asm
\masm32\bin\Link /SUBSYSTEM:CONSOLE *.obj 


и всё вот в чем была проблемма.

Как мне показалось компоновшик и ассемблер от Borland был гораздо лучше реализован. Они по крайней мере правильно указывали причину ошибок.

Спасибо всем кто пытася помочь 

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)