Привет всем! Следующий код я собираю так: C:\masm32\bin\ml /nologo /c /coff main.asm C:\masm32\bin\link /nologo main lib\libc.lib lib\kernel32.lib Но линкер выдает ошибку: libc.lib(crt0.obj) : error LNK2001: unresolved external symbol _main main.exe : fatal error LNK1120: 1 unresolved externals Видимо, он не видит точку входа. Как можно ему ее указать? Пробовал /entry в опциях линкера, но скомпилированная программа при запуске падает, не выводя ничего. Код (Text): .586p .model flat, stdcall option casemap :none ; case sensitive include C:\masm32\include\windows.inc include C:\masm32\include\masm32.inc include C:\masm32\include\kernel32.inc include C:\masm32\macros\macros.asm includelib C:\masm32\lib\masm32.lib includelib C:\masm32\lib\kernel32.lib EXTRN printf:PROC .data test_string db "Hello, World!", 0 .code main PROC NEAR push OFFSET test_string call printf exit main endp end
1) в масме традиционно точка входа увазывается после слова end, т.е. в твоём случае нужно писать end main обычно объявляют метку старт. так же её можно объявить через /ENTRY линкеру 2) падает потому что printf это функция из библиотеки C которая нуждается в инициализации.. В С программах где используються рантаймовые функции, оригинальная точка входа не твоя main а тоже рантайвовская функция которая производит инициализацию, значит либо юзай функции кернела либо казывай точку входа рантаймовской функции.. называются они если память не изменяет mainCRTStartup для консолького приложения и WinMainCRTStartup для gui
slackhead Если это динамическая версия MSVCRT, то никакой дополнительной инициализации для успешного использования printf не нужно.