Есть файл 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 и ещё интересует как вызывать из модуля, процедуры определённые в главной программе
2FED Для простоты рассматриваем 2-ой урок Iczelion'а есть файл 0.asm Код (Text): .686P .model flat public MsgCaption,MsgBoxText .data MsgCaption db "Iczelion Tutorial #2:MessageBox",0 MsgBoxText db "Win32 Assembly with masm is Great!",0 end есть основной модуль mtut_02.asm с инвоком Код (Text): .686P .model flat include windows.inc includelib user32.lib include user32.inc extern MsgCaption:byte,MsgBoxText:byte .code start: invoke MessageBox, NULL,addr MsgBoxText, addr MsgCaption, MB_OK ret end start и есть bat-файл, который всё собирает Код (Text): cls set masm_path=c:\masm32 %masm_path%\bin\ml /c /Cp /Gz /I%masm_path%\include /coff /nologo mtut_02.asm || exit %masm_path%\bin\ml /c /Cp /Gz /I%masm_path%\include /coff /nologo 0.asm || exit %masm_path%\bin\Link /SUBSYSTEM:WINDOWS /LIBPATH:%masm_path%\lib /NOLOGO mtut_02.obj 0.obj del mtut_02.obj del 0.obj Получившийся экзешник, исходные файлы и bat в аттаче. Заметьте, никаких "include 0.asm" у меня нет -- может быть причина в этой строке?
Пхе-пхе.... Всё куда проще: надо объявлять переменные перед использованием invoke, поскольку оная раскрывается на первом проходе ассемблера. Код (Text): ;============; test.asm ;============; .386 .model flat,stdcall option casemap:none include \masm32\include\windows.inc include \masm32\include\user32.inc include \masm32\include\kernel32.inc includelib \masm32\lib\user32.lib includelib \masm32\lib\kernel32.lib .data szCaption db "Hello, Sailor!",0 szMsg1 db "CALL",0 szMsg2 db "INVOKE",0 .code BADCODE: include module.asm invoke ExitProcess,0 end BADCODE ;============; module.asm ;============; .code push 0 push offset szCaption push offset szMsg1 push 0 call MessageBoxA invoke MessageBoxA,0,addr szMsg2,addr szCaption,0 ;============; build.bat ;============; @echo off \masm32\bin\ml /c /coff /Cp test.asm \masm32\bin\link /subsystem:windows test.obj pause > NUL Если перенести строчку "include module.asm" выше объявления меток, то получим "error A2006: undefined symbol" и "error A2114: INVOKE argument type mismatch :", что и происходит у ТС.
Предыдущему человеку. Не проверял, решена ли задача, но, если решена, то, наверное, с некоторым нарушением условия. Ибо по условию: 1) Основной модуль это тот, из которого вызывается функция MessageBoxA. Его не "инклудим" 2) Вспомогательный- тот, где объявлены переменные. Его инклудим (ТС это делает безуспешно) Вот нужно при таких условиях решить задачу. А Вы основной модуль "инклудите", а "инклудный" (тот, в котором объявлены переменные) автоматом переходит в разряд основных. Нарушается условие задачи таким образом. Извините мне мою дерзость и мой язык.
И это самое. ОТвлечёмся от инклуда. Друзья, вот отрывок кода, который привёл ТС invoke SendMessage,stList,LVM_..,0,0 Этот отрывок кода находится в главной программе. И в главной же программе определена переменная stList. Да, ибо чуть выше написано push stList ;переменная определённая в главное программе. Вообще-то коль скоро переменная объявлена до invoke в этом же модуле (мы этот модуль называем "главной программой"), и не работает вызов invoke, так никакие инклуды тут до поры до времени ни при чём, и без них всё должно работать. Надо с этим разбираться.
amvoz та нет, просто я взял определённый функционал вынес в отдельный модуль, просто потому что программа так разраслась что надо её как то разбивать, а хендлы к которым обращается этот функционал лежат в главном модуле. Mikl___ про ассемблирование каждого модуля в отдельности и потом указания линкеру всех нужных .obj файлов я знаю, мне этот способ не нравится потому что неудобно каждый раз лазить в опции линкера.