Match в макросах, и процедуры без заглушки в Fasm?

Тема в разделе "WASM.ASSEMBLER", создана пользователем Arthur, 8 апр 2007.

  1. Arthur

    Arthur New Member

    Публикаций:
    0
    Регистрация:
    27 янв 2007
    Сообщения:
    494
    Добрый день!
    Мучаюсь последнее время с макросами и не могу заставить Fasm работать с dll ф-циями на прямую. Итак начну по порядку.

    Match In Macro's:
    Хочу написать макрос который бы позволил мне обьявлять строковые метки в стиле C/C++. Но чего-то не получается.
    Код (Text):
    1.     macro string varname,[args]
    2.     {
    3.     common
    4.     match =vname==, varname
    5.     \{
    6.         common label vname ; переставлял на varname, непомогло :(
    7.     \} 
    8.     forward
    9.         db args
    10.     }
    11.  
    12.     ; Пытаюсь обьявить
    13.     string myStr1 = "String As In C/C++",0
    14.  
    15.     ; Пытаюсь занести адрес в EDI
    16.     mov edi, myStr1 ; Error
    Компилит все нисчяк. Но когда я обращаюсь к myStr1, то пишет что имя я выдумал, нету такой метки, а точнее "Error: undefined symbol". Можь я начудил чего то не того? Поясните пожайлуста.

    Процедура и Заглушка:
    Наверно не секрет что реальное название процедур в стандартных библиотеках виндауна, __imp__ExitProcess@4, а не _ExitProcess@4 (это stdcall конвенция). Так вот компиляторы создают заглушки. При вызове процедуры, на самом деле вызывается совсем другая метка, а уже оттуда вызывается реальная ф-ция. Так вот, можно ли в FASM с использованием format PE, вызывать процедуры на прямую? т. е. __imp__ExitProcess@4. Знаю только то что при форматировании COFF или MS COFF, моно делать вот такой выкрутас:
    Код (Text):
    1.     extrn '__imp__ExitProcess@4' as ExitProcess:dword
    Но для PE формата, не канает, fasm ругается.
     
  2. wasm_test

    wasm_test wasm test user

    Публикаций:
    0
    Регистрация:
    24 ноя 2006
    Сообщения:
    5.582
    там есть оба имени. и с __imp_ и без него. stdcall тут не при чем, это чтобы собиралось в си со спецификатором __declspec(dllimport) и без него тоже
    в смысле для пе формата. если ты собираешь exe сразу, а не obj, о каких lib вообще идет тогда речь. создавай импорт сам как тебе нравится
     
  3. asmfan

    asmfan New Member

    Публикаций:
    0
    Регистрация:
    10 июл 2006
    Сообщения:
    1.004
    Адрес:
    Abaddon
    Arthur, я вижу здесь глубокое заблуждение по поводу фасма.
    фасм не создаёт никаких заглушек и это покажет любой hex-редактор. сразу косвенный call на IAT. Этой проблемой страдает тасм и частично масм (про другие пакеты не скажу). Hex-редактор/дизассемблер в руки в вперёд.
     
  4. Arthur

    Arthur New Member

    Публикаций:
    0
    Регистрация:
    27 янв 2007
    Сообщения:
    494
    Ну вот к примеру:
    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 явно указать конвенцию относящиюся как к экспортируемой, так и к импортируемой процедуры.
     
  5. n0name

    n0name New Member

    Публикаций:
    0
    Регистрация:
    5 июн 2004
    Сообщения:
    4.336
    Адрес:
    Russia
    double
     
  6. Asterix

    Asterix New Member

    Публикаций:
    0
    Регистрация:
    25 фев 2003
    Сообщения:
    3.576
    Arthur
    вы не познали дзен фасма, а также таинство медитации в хекс редакторе

    n0name
    у вас браузер дуплит :)
     
  7. asmfan

    asmfan New Member

    Публикаций:
    0
    Регистрация:
    10 июл 2006
    Сообщения:
    1.004
    Адрес:
    Abaddon
    Вижу здесь непонимания происходящих процессов и мат.части. PE - формат испольняемых файлов Win*. COFF - формат объектных (*.obj) файлов. Mangling имён имеет смысл для объектных файлов и библиотек импорта (*.lib), т.е. они скармливаюстя линкеру, который можно сказать и стыкует obj с lib --> exe. Для фасм не актуально, т.к. нет промежуточных форматов, а сразу exe. Читать матчасть.
     
  8. n0name

    n0name New Member

    Публикаций:
    0
    Регистрация:
    5 июн 2004
    Сообщения:
    4.336
    Адрес:
    Russia
    Asterix
    ага? имхо это форум дублит :P
    Ибо не токо у меня.
     
  9. Asterix

    Asterix New Member

    Публикаций:
    0
    Регистрация:
    25 фев 2003
    Сообщения:
    3.576
    а у меня нет, странно :)
     
  10. Freeman

    Freeman New Member

    Публикаций:
    0
    Регистрация:
    10 фев 2005
    Сообщения:
    1.385
    Адрес:
    Ukraine
    Arthur, а вы fasm.pdf читали,потомучто ваш макрос просто внутрь match не доходит, а значит и метку не создает..
    Код (Text):
    1. macro string varname,[args]
    2.         {
    3.         match  a==b, varname
    4.         \{
    5.  
    6.                a db b,args
    7.         \}
    8. }
    так вроде как проще
     
  11. Arthur

    Arthur New Member

    Публикаций:
    0
    Регистрация:
    27 янв 2007
    Сообщения:
    494
    FreeManCPM читаю, но не всегда даходит с первого раза :) Да и с инглиш туговато.
    Спасибо за правельный макрос! Буду тренироваться в макросах :)

    Asterix да вы правы :) Времени не так много :) Но постепенно я усовершенствуюсь, и нет, нет провожу медитацию с Олькой и IDA'ай :)

    asmfan ну раз такой фигней (заглушками) страдает восновном TASM, а Fasm делает напрямую вызов, значить все велеколепно!

    Благодорю Всех за помощь!