Добрый день! Мучаюсь последнее время с макросами и не могу заставить Fasm работать с dll ф-циями на прямую. Итак начну по порядку. Match In Macro's: Хочу написать макрос который бы позволил мне обьявлять строковые метки в стиле C/C++. Но чего-то не получается. Код (Text): macro string varname,[args] { common match =vname==, varname \{ common label vname ; переставлял на varname, непомогло :( \} forward db args } ; Пытаюсь обьявить string myStr1 = "String As In C/C++",0 ; Пытаюсь занести адрес в EDI mov edi, myStr1 ; Error Компилит все нисчяк. Но когда я обращаюсь к myStr1, то пишет что имя я выдумал, нету такой метки, а точнее "Error: undefined symbol". Можь я начудил чего то не того? Поясните пожайлуста. Процедура и Заглушка: Наверно не секрет что реальное название процедур в стандартных библиотеках виндауна, __imp__ExitProcess@4, а не _ExitProcess@4 (это stdcall конвенция). Так вот компиляторы создают заглушки. При вызове процедуры, на самом деле вызывается совсем другая метка, а уже оттуда вызывается реальная ф-ция. Так вот, можно ли в FASM с использованием format PE, вызывать процедуры на прямую? т. е. __imp__ExitProcess@4. Знаю только то что при форматировании COFF или MS COFF, моно делать вот такой выкрутас: Код (Text): extrn '__imp__ExitProcess@4' as ExitProcess:dword Но для PE формата, не канает, fasm ругается.
там есть оба имени. и с __imp_ и без него. stdcall тут не при чем, это чтобы собиралось в си со спецификатором __declspec(dllimport) и без него тоже в смысле для пе формата. если ты собираешь exe сразу, а не obj, о каких lib вообще идет тогда речь. создавай импорт сам как тебе нравится
Arthur, я вижу здесь глубокое заблуждение по поводу фасма. фасм не создаёт никаких заглушек и это покажет любой hex-редактор. сразу косвенный call на IAT. Этой проблемой страдает тасм и частично масм (про другие пакеты не скажу). Hex-редактор/дизассемблер в руки в вперёд.
Ну вот к примеру: library kernel32, 'kernel32.dll' import kernel32, ExitProcess, 'ExitProcess' Работает нормально. Но ведь ExitProcess нет такой процедуры в Kernel32, есть '_ExitProcess@4'. Но когда я пишу '_ExitProcess@4' вместо 'ExitProcess', то вылазит ошибка, мол нету _ExitProcess@4. Еще есть пример (стандартный у fasm'a) как создать свою DLL, там экспорт осуществляется просто именем, без отображения конвенции stdcall, а я написал функции именно искажая имя под stdcall. И они оба работают нормально. Я хотел бы явно (вручную) указывать как искажать имена. Great как это stdcall непричем? Ведь все ф-ции WinAPI, именно под эту конвенцию и косят. lib'ы мне ненужны. Мне нужно явно указывать какая ф-ция по какой конвенции импортируется и по какой экспортируется. asmfan значить зря я покасился на fasm, вспоминая tasm Ну вообщем вопрос такой: Как в FASM явно указать конвенцию относящиюся как к экспортируемой, так и к импортируемой процедуры.
Arthur вы не познали дзен фасма, а также таинство медитации в хекс редакторе n0name у вас браузер дуплит
Вижу здесь непонимания происходящих процессов и мат.части. PE - формат испольняемых файлов Win*. COFF - формат объектных (*.obj) файлов. Mangling имён имеет смысл для объектных файлов и библиотек импорта (*.lib), т.е. они скармливаюстя линкеру, который можно сказать и стыкует obj с lib --> exe. Для фасм не актуально, т.к. нет промежуточных форматов, а сразу exe. Читать матчасть.
Arthur, а вы fasm.pdf читали,потомучто ваш макрос просто внутрь match не доходит, а значит и метку не создает.. Код (Text): macro string varname,[args] { match a==b, varname \{ a db b,args \} } так вроде как проще
FreeManCPM читаю, но не всегда даходит с первого раза Да и с инглиш туговато. Спасибо за правельный макрос! Буду тренироваться в макросах Asterix да вы правы Времени не так много Но постепенно я усовершенствуюсь, и нет, нет провожу медитацию с Олькой и IDA'ай asmfan ну раз такой фигней (заглушками) страдает восновном TASM, а Fasm делает напрямую вызов, значить все велеколепно! Благодорю Всех за помощь!