проблема с модулями

Тема в разделе "WASM.BEGINNERS", создана пользователем 2FED, 2 мар 2009.

  1. 2FED

    2FED New Member

    Публикаций:
    0
    Регистрация:
    20 фев 2008
    Сообщения:
    1.002
    Есть файл module.asm

    я его подключаю в свою программу

    include module.asm


    в файле module.asm можно обращатся к переменным определённым в главной программе. но invoke эти переменные не хавает, говорит типо не найдено таких переменных.

    тоесть такой код работает

    ;module.asm

    .code

    SendProc proc
    push 0
    push 0
    push LVM_.... ;message
    push stList ;переменная определённая в главное программе.
    call SendMessage
    SendProc endp

    но неработает
    invoke SendMessage,stList,LVM_..,0,0


    и ещё интересует как вызывать из модуля, процедуры определённые в главной программе
     
  2. litrovith

    litrovith Member

    Публикаций:
    0
    Регистрация:
    20 июн 2007
    Сообщения:
    509
    чтоб всё было нормально module.asm нуна подключать в секции .code главной программы
     
  3. Mikl___

    Mikl___ Супермодератор Команда форума

    Публикаций:
    14
    Регистрация:
    25 июн 2008
    Сообщения:
    3.914
    2FED
    Для простоты рассматриваем 2-ой урок Iczelion'а
    есть файл 0.asm
    Код (Text):
    1. .686P
    2. .model flat
    3. public MsgCaption,MsgBoxText
    4. .data
    5. MsgCaption      db "Iczelion Tutorial #2:MessageBox",0
    6. MsgBoxText      db "Win32 Assembly with masm is Great!",0
    7. end
    есть основной модуль mtut_02.asm с инвоком
    Код (Text):
    1. .686P
    2. .model flat
    3. include windows.inc
    4. includelib user32.lib
    5. include user32.inc
    6. extern MsgCaption:byte,MsgBoxText:byte
    7. .code
    8. start:  invoke MessageBox, NULL,addr MsgBoxText, addr MsgCaption, MB_OK
    9.     ret
    10. end start
    и есть bat-файл, который всё собирает
    Код (Text):
    1. cls
    2. set masm_path=c:\masm32
    3. %masm_path%\bin\ml /c /Cp /Gz /I%masm_path%\include /coff /nologo mtut_02.asm  || exit
    4. %masm_path%\bin\ml /c /Cp /Gz /I%masm_path%\include /coff /nologo 0.asm  || exit
    5. %masm_path%\bin\Link /SUBSYSTEM:WINDOWS /LIBPATH:%masm_path%\lib /NOLOGO mtut_02.obj 0.obj
    6. del mtut_02.obj
    7. del 0.obj
    Получившийся экзешник, исходные файлы и bat в аттаче. Заметьте, никаких "include 0.asm" у меня нет -- может быть причина в этой строке?
     
  4. G13

    G13 New Member

    Публикаций:
    0
    Регистрация:
    24 мар 2006
    Сообщения:
    499
    Пхе-пхе.... Всё куда проще: надо объявлять переменные перед использованием invoke, поскольку оная раскрывается на первом проходе ассемблера.

    Код (Text):
    1. ;============; test.asm ;============;
    2. .386
    3. .model flat,stdcall
    4. option casemap:none
    5. include \masm32\include\windows.inc
    6. include \masm32\include\user32.inc
    7. include \masm32\include\kernel32.inc
    8. includelib \masm32\lib\user32.lib
    9. includelib \masm32\lib\kernel32.lib
    10.  
    11. .data
    12. szCaption   db "Hello, Sailor!",0
    13. szMsg1      db "CALL",0
    14. szMsg2      db "INVOKE",0
    15.  
    16. .code
    17. BADCODE:
    18. include module.asm
    19. invoke ExitProcess,0
    20. end BADCODE
    21.  
    22. ;============; module.asm ;============;
    23. .code
    24. push    0
    25. push    offset szCaption
    26. push    offset szMsg1
    27. push    0
    28. call    MessageBoxA
    29.  
    30. invoke MessageBoxA,0,addr szMsg2,addr szCaption,0
    31.  
    32. ;============; build.bat ;============;
    33. @echo off
    34. \masm32\bin\ml /c /coff /Cp test.asm
    35. \masm32\bin\link /subsystem:windows test.obj
    36. pause > NUL
    Если перенести строчку "include module.asm" выше объявления меток, то получим "error A2006: undefined symbol" и "error A2114: INVOKE argument type mismatch :", что и происходит у ТС.
     
  5. amvoz

    amvoz Member

    Публикаций:
    0
    Регистрация:
    12 ноя 2008
    Сообщения:
    653
    Предыдущему человеку.
    Не проверял, решена ли задача, но, если решена, то, наверное, с некоторым нарушением условия.
    Ибо по условию:
    1) Основной модуль это тот, из которого вызывается функция MessageBoxA. Его не "инклудим"
    2) Вспомогательный- тот, где объявлены переменные. Его инклудим (ТС это делает безуспешно)

    Вот нужно при таких условиях решить задачу.
    А Вы основной модуль "инклудите", а "инклудный" (тот, в котором объявлены переменные) автоматом переходит в разряд основных.
    Нарушается условие задачи таким образом.

    Извините мне мою дерзость и мой язык.
     
  6. amvoz

    amvoz Member

    Публикаций:
    0
    Регистрация:
    12 ноя 2008
    Сообщения:
    653
    И это самое. ОТвлечёмся от инклуда. Друзья, вот отрывок кода, который привёл ТС

    invoke SendMessage,stList,LVM_..,0,0

    Этот отрывок кода находится в главной программе. И в главной же программе определена переменная stList. Да, ибо чуть выше написано

    push stList ;переменная определённая в главное программе.

    Вообще-то коль скоро переменная объявлена до invoke в этом же модуле (мы этот модуль называем "главной программой"), и не работает вызов invoke, так никакие инклуды тут до поры до времени ни при чём, и без них всё должно работать. Надо с этим разбираться.
     
  7. 2FED

    2FED New Member

    Публикаций:
    0
    Регистрация:
    20 фев 2008
    Сообщения:
    1.002
    amvoz та нет, просто я взял определённый функционал вынес в отдельный модуль, просто потому что программа так разраслась что надо её как то разбивать, а хендлы к которым обращается этот функционал лежат в главном модуле.

    Mikl___ про ассемблирование каждого модуля в отдельности и потом указания линкеру всех нужных .obj файлов я знаю, мне этот способ не нравится потому что неудобно каждый раз лазить в опции линкера.