Минимальная dll на масме32

Тема в разделе "WASM.BEGINNERS", создана пользователем Victor_S, 28 окт 2011.

  1. Victor_S

    Victor_S New Member

    Публикаций:
    0
    Регистрация:
    28 окт 2011
    Сообщения:
    28
    Создал для тестирования dll вот такого содержания:
    Код (Text):
    1. .686
    2. .model flat
    3. .code
    4.  
    5. dllMain proc
    6.     mov eax,1
    7.     ret
    8. dllMain endp
    9.  
    10. memCpy32 proc
    11.     mov eax,5
    12.     ret
    13. memCpy32 endp
    14.  
    15. end
    Но когда начал компилировать, возникла такая проблема: объектный файл создаётся, а dll - нет. Линкер ругается говорит нераспознанный ключ /z2, но я такого никогда не писал. Вот командная строка: ml MemManager32DLL.asm /link /dll /out:"MemManager32DLL.dll" /entry:dllMain /def:MemManager32DLL.def А вот скрин:
     
  2. Blackbeam

    Blackbeam New Member

    Публикаций:
    0
    Регистрация:
    28 дек 2008
    Сообщения:
    960
    вопрос - ты чтонить успешно "создавал" на масме или решил сразу взять быка так сказать за рога и занялся творчеством?
     
  3. Blackbeam

    Blackbeam New Member

    Публикаций:
    0
    Регистрация:
    28 дек 2008
    Сообщения:
    960
    у меня например во всех исходникахъ:

    .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
     
  4. Victor_S

    Victor_S New Member

    Публикаций:
    0
    Регистрация:
    28 окт 2011
    Сообщения:
    28
    Да ещё не пришлось. Но masm64 это схавал (только без .686 и .model flat), и я проверял работу в Visual Studio, подключая эту dll, так что я не пойму, что не понравилось масму32?
     
  5. AndjellaArtavazdovna

    AndjellaArtavazdovna New Member

    Публикаций:
    0
    Регистрация:
    3 дек 2010
    Сообщения:
    615
    Victor_S
    Почитайте Iczeliona и мучайтесь.
     
  6. Victor_S

    Victor_S New Member

    Публикаций:
    0
    Регистрация:
    28 окт 2011
    Сообщения:
    28
    1.
    Мне соглашения о вызовах не нужны, так как я пишу только под C++ и использую его соглашения о вызовах. Т. е. стек очищает вызывающая программа и с ним дополнительных манипуляций делать не надо. Праметры передаются таким образом, что более правому параметру соответствует больший адрес. Вот, в принципе и всё, что мне нужно.
    2.
    Различие регистра букв, в принципе, мне тоже без разницы, но можно и добавить. Но ведь от этого моя проблема не решится.
    3.
    Подключать модули мне тоже не нужно, потому что я к ним не буду обращаться, так как это сделает C++ программа, а ассемблер мне нужен для оптимизации вычислений, но по необходимости их можно добавить. Но это проблему тоже не решит.

    А проблема в том, что
    , и к исходному тексту программы, она, видимо не относится, или я не прав?
     
  7. Victor_S

    Victor_S New Member

    Публикаций:
    0
    Регистрация:
    28 окт 2011
    Сообщения:
    28
    Я посмотрел, но они про win API, а до этого я пока не дошёл. Мне бы dll нормально скомпилировать.
     
  8. shchetinin

    shchetinin Member

    Публикаций:
    0
    Регистрация:
    27 май 2011
    Сообщения:
    715
    Victor_S
    Прежде чем такое говорить ты должен понять силы суть:)

    x64 не имеет соглашения об вызовах точнее у него оно всегда одно в принципе(Исключения переменное количество параметров). А вот в x86 это есть. По этому линкер и ругается(А не компилятор). dllMain какого должен быть соглашения?
     
  9. Victor_S

    Victor_S New Member

    Публикаций:
    0
    Регистрация:
    28 окт 2011
    Сообщения:
    28
    Добавил stdcall, но не помогло.
    Да, но ведь линкер не ругается, скажем, на отсутствие какой-либо функции, или на её неверный формат, а он ругается на
    (посмотрите внимательно скрин). И меня интересует вопрос, откуда он его взял и что мне с этим делать?
     
  10. shchetinin

    shchetinin Member

    Публикаций:
    0
    Регистрация:
    27 май 2011
    Сообщения:
    715
    Приаттачте ваш последний исходник. и строку для компиляции.
     
  11. Victor_S

    Victor_S New Member

    Публикаций:
    0
    Регистрация:
    28 окт 2011
    Сообщения:
    28
    Вот исходник:
    Код (Text):
    1. .386
    2.  
    3. .model flat, stdcall
    4.  
    5. .code
    6.  
    7. dllMain proc
    8.     mov eax,1
    9.     ret
    10. dllMain endp
    11.  
    12. memCpy32 proc
    13.     mov eax,5
    14.     ret
    15. memCpy32 endp
    16.  
    17. end dllMain
    Вот строка: ml MemManager32DLL.asm /link /dll /out:"MemManager32DLL.dll" /entry:dllMain /def:MemManager32DLL.def

    Но на всякий случай решил проверить и скомпилировать шаблон, созданный MASM Builder'ом. И та же ошибка. Вот исходдник:
    Код (Text):
    1.     .386
    2.     .model flat,stdcall
    3.     option casemap:none
    4.     include C:\masm32\include\windows.inc
    5.     include C:\masm32\include\user32.inc
    6.     include C:\masm32\include\kernel32.inc
    7.     include C:\masm32\include\masm32.inc
    8.     includelib C:\masm32\lib\user32.lib
    9.     includelib C:\masm32\lib\kernel32.lib
    10.     includelib C:\masm32\lib\masm32.lib
    11. szText MACRO Name,Text:VARARG
    12.     LOCAL   lbl
    13.     jmp     lbl
    14.     Name    db Text,0
    15.     lbl:
    16. ENDM
    17. .const
    18. .data?
    19. .data
    20. szMessage   db "Message",0
    21. .code
    22. start:
    23. invoke  AllocConsole
    24. invoke  StdOut,addr szMessage
    25. invoke  ExitProcess,0
    26. end start
    Вот строка компиляции: ml AT.asm
    Может, у меня компилятор не такой?
     
  12. shchetinin

    shchetinin Member

    Публикаций:
    0
    Регистрация:
    27 май 2011
    Сообщения:
    715
    Код (Text):
    1. .686
    2. .model flat
    3. .code
    4.  
    5. dllMain proc STDCALL hinstDLL:DWORD, fdwReason:DWORD, lpvReserved:DWORD
    6.     mov eax,1
    7.     ret
    8. dllMain endp
    9.  
    10. memCpy32 proc
    11.     mov eax,5
    12.     ret
    13. memCpy32 endp
    14.  
    15. end
    странно но у меня компилится? думаете магия?
     
  13. Dmitry_Milk

    Dmitry_Milk Member

    Публикаций:
    0
    Регистрация:
    20 ноя 2007
    Сообщения:
    540
    Раз проблема с линкером - попробуй явно разбить процесс на компиляцию и линковку. Укажи ml ключ /c, пусть только компилирует, а obj вручную отдай на съедение link. Фактически ml сам вызывает link для линковки с некоторыми параметрами, и такое ощущение, что у тебя ml и link из разных наборов масма.

    Кстати, а в MemManager32DLL.def ничего лишнего нет?
     
  14. Dmitry_Milk

    Dmitry_Milk Member

    Публикаций:
    0
    Регистрация:
    20 ноя 2007
    Сообщения:
    540
    Внимательнее посмотрел. У тебя ошибка оказывается не из-за ключа /z2 (он просто проигнорировался), а из-за того, что линкеру сама структура обжа не понравилась.
     
  15. shchetinin

    shchetinin Member

    Публикаций:
    0
    Регистрация:
    27 май 2011
    Сообщения:
    715
    Dmitry_Milk
    Вот проблема
    Код (Text):
    1. dllMain proc STDCALL hinstDLL:DWORD, fdwReason:DWORD, lpvReserved:DWORD
     
  16. Dmitry_Milk

    Dmitry_Milk Member

    Публикаций:
    0
    Регистрация:
    20 ноя 2007
    Сообщения:
    540
    shchetinin, нет, не это. Если это не соблюдать - компилируется и линкуется (просто с ворнингом). У тс же что-то странное, у него линкер не хочет признавать obj-файл вообще как корректный (см. его картинку).
     
  17. Victor_S

    Victor_S New Member

    Публикаций:
    0
    Регистрация:
    28 окт 2011
    Сообщения:
    28
    Вот MemManager32DLL.def:
    Код (Text):
    1. LIBRARY MemManager32DLL
    2. EXPORTS
    3. memCpy32
     
  18. Dmitry_Milk

    Dmitry_Milk Member

    Публикаций:
    0
    Регистрация:
    20 ноя 2007
    Сообщения:
    540
    Попробуйте все-таки компилировать и линковать отдельно, явно указывая линкер. Сдается мне, что ваш ml какой-то не тот линкер находит. У меня ваш код нормально билдится, даже если не указывать обязательные параметры dllMain (просто ворнинг выдает, но результирующий файл все равно появляется). Чтоб не ругался про z2 опцию - компилируйте obj формата COFF, а не OMF.
     
  19. Victor_S

    Victor_S New Member

    Публикаций:
    0
    Регистрация:
    28 окт 2011
    Сообщения:
    28
    Да, копилируется, если по-отдельности. Но визуал студио почему-то функцию memCpy32 не видит, но это уже отдельная история. А в dllMain я должен что-то со стеком делать, чтобы было корректно, просто stdcall функция по-моему должна сама очищать стек от параметров?
     
  20. Victor_S

    Victor_S New Member

    Публикаций:
    0
    Регистрация:
    28 окт 2011
    Сообщения:
    28
    А как указать компилятору, чтобы obj был формата coff?