Создал для тестирования dll вот такого содержания: Код (Text): .686 .model flat .code dllMain proc mov eax,1 ret dllMain endp memCpy32 proc mov eax,5 ret memCpy32 endp end Но когда начал компилировать, возникла такая проблема: объектный файл создаётся, а dll - нет. Линкер ругается говорит нераспознанный ключ /z2, но я такого никогда не писал. Вот командная строка: ml MemManager32DLL.asm /link /dll /out:"MemManager32DLL.dll" /entry:dllMain /def:MemManager32DLL.def А вот скрин:
вопрос - ты чтонить успешно "создавал" на масме или решил сразу взять быка так сказать за рога и занялся творчеством?
у меня например во всех исходникахъ: .model flat,stdcall option casemap:none include \masm32\include\windows.inc include \masm32\include\kernel32.inc include \masm32\include\user32.inc ;include \masm32\include\comdlg32.inc ;include \masm32\include\gdi32.inc ;include \masm32\include\comctl32.inc ;include \masm32\include\masm32.inc ;includelib \masm32\lib\masm32.lib ;includelib \masm32\lib\comctl32.lib ;includelib \masm32\lib\gdi32.lib ;includelib \masm32\lib\comdlg32.lib includelib \masm32\lib\user32.lib includelib \masm32\lib\kernel32.lib почитай что означают сии таинственные сочетания букв хорошая IDE для масма: http://blackbeam.narod.ru/asm.htm
Да ещё не пришлось. Но masm64 это схавал (только без .686 и .model flat), и я проверял работу в Visual Studio, подключая эту dll, так что я не пойму, что не понравилось масму32?
1. Мне соглашения о вызовах не нужны, так как я пишу только под C++ и использую его соглашения о вызовах. Т. е. стек очищает вызывающая программа и с ним дополнительных манипуляций делать не надо. Праметры передаются таким образом, что более правому параметру соответствует больший адрес. Вот, в принципе и всё, что мне нужно. 2. Различие регистра букв, в принципе, мне тоже без разницы, но можно и добавить. Но ведь от этого моя проблема не решится. 3. Подключать модули мне тоже не нужно, потому что я к ним не буду обращаться, так как это сделает C++ программа, а ассемблер мне нужен для оптимизации вычислений, но по необходимости их можно добавить. Но это проблему тоже не решит. А проблема в том, что , и к исходному тексту программы, она, видимо не относится, или я не прав?
Victor_S Прежде чем такое говорить ты должен понять силы суть x64 не имеет соглашения об вызовах точнее у него оно всегда одно в принципе(Исключения переменное количество параметров). А вот в x86 это есть. По этому линкер и ругается(А не компилятор). dllMain какого должен быть соглашения?
Добавил stdcall, но не помогло. Да, но ведь линкер не ругается, скажем, на отсутствие какой-либо функции, или на её неверный формат, а он ругается на (посмотрите внимательно скрин). И меня интересует вопрос, откуда он его взял и что мне с этим делать?
Вот исходник: Код (Text): .386 .model flat, stdcall .code dllMain proc mov eax,1 ret dllMain endp memCpy32 proc mov eax,5 ret memCpy32 endp end dllMain Вот строка: ml MemManager32DLL.asm /link /dll /out:"MemManager32DLL.dll" /entry:dllMain /def:MemManager32DLL.def Но на всякий случай решил проверить и скомпилировать шаблон, созданный MASM Builder'ом. И та же ошибка. Вот исходдник: Код (Text): .386 .model flat,stdcall option casemap:none include C:\masm32\include\windows.inc include C:\masm32\include\user32.inc include C:\masm32\include\kernel32.inc include C:\masm32\include\masm32.inc includelib C:\masm32\lib\user32.lib includelib C:\masm32\lib\kernel32.lib includelib C:\masm32\lib\masm32.lib szText MACRO Name,Text:VARARG LOCAL lbl jmp lbl Name db Text,0 lbl: ENDM .const .data? .data szMessage db "Message",0 .code start: invoke AllocConsole invoke StdOut,addr szMessage invoke ExitProcess,0 end start Вот строка компиляции: ml AT.asm Может, у меня компилятор не такой?
Код (Text): .686 .model flat .code dllMain proc STDCALL hinstDLL:DWORD, fdwReason:DWORD, lpvReserved:DWORD mov eax,1 ret dllMain endp memCpy32 proc mov eax,5 ret memCpy32 endp end странно но у меня компилится? думаете магия?
Раз проблема с линкером - попробуй явно разбить процесс на компиляцию и линковку. Укажи ml ключ /c, пусть только компилирует, а obj вручную отдай на съедение link. Фактически ml сам вызывает link для линковки с некоторыми параметрами, и такое ощущение, что у тебя ml и link из разных наборов масма. Кстати, а в MemManager32DLL.def ничего лишнего нет?
Внимательнее посмотрел. У тебя ошибка оказывается не из-за ключа /z2 (он просто проигнорировался), а из-за того, что линкеру сама структура обжа не понравилась.
Dmitry_Milk Вот проблема Код (Text): dllMain proc STDCALL hinstDLL:DWORD, fdwReason:DWORD, lpvReserved:DWORD
shchetinin, нет, не это. Если это не соблюдать - компилируется и линкуется (просто с ворнингом). У тс же что-то странное, у него линкер не хочет признавать obj-файл вообще как корректный (см. его картинку).
Попробуйте все-таки компилировать и линковать отдельно, явно указывая линкер. Сдается мне, что ваш ml какой-то не тот линкер находит. У меня ваш код нормально билдится, даже если не указывать обязательные параметры dllMain (просто ворнинг выдает, но результирующий файл все равно появляется). Чтоб не ругался про z2 опцию - компилируйте obj формата COFF, а не OMF.
Да, копилируется, если по-отдельности. Но визуал студио почему-то функцию memCpy32 не видит, но это уже отдельная история. А в dllMain я должен что-то со стеком делать, чтобы было корректно, просто stdcall функция по-моему должна сама очищать стек от параметров?