Import. FASM.

Тема в разделе "WASM.BEGINNERS", создана пользователем l_inc, 21 май 2007.

  1. l_inc

    l_inc New Member

    Публикаций:
    0
    Регистрация:
    29 сен 2005
    Сообщения:
    2.566
    Решил ткнуться в FASM (сим пытаюсь ненавязчиво намекнуть: не пинайте, пожалуйста, за глупость) и тут же коленки пооббивал. Начал с того, что написал маленькую dll-ку (предварительно почитав, разумеется, прилагающийся manual и примеры), но не суть. Среди прочего импорт оформил вот так:
    Код (Text):
    1. section '.idata' import data readable writeable
    2.    library kernel,'KERNEL32.DLL'
    3.    library user,'USER32.DLL'
    4.             ..............................
    , а не так:
    Код (Text):
    1. section '.idata' import data readable writeable
    2.    library kernel,'KERNEL32.DLL',\
    3.             user,'USER32.DLL'
    4.             ..............................
    Не прошло и четырех часов тупого пяленья в три строчки кода, как я обнаружил ошибку. :-(
    Причем все успешно компилируется. Зато потом при попытке вызвать какую-нибудь функцию из этой dll-ки появляется огромный выбор на любой вкус из трех вариантов: отладка, отправить отчет, не отправлять отчет (ну... можно еще посмотреть этот самый отчет, что не избавляет от необходимости выбора из вышеуказанных трех вариантов). IDA, в свою очередь, показывает, что fasm накомпилировал какую-то белибердистику.
    Так вот,
    I если так делать можно, то
    1) почему это нигде не описано (в manual'е все очень сжато и... и вообще мало написано)?
    2) с какой целью это можно делать?
    II если так делать нельзя, то
    1) опять таки, почему это нигде не описано?
    и
    2) самый главный вопрос: Почему компилятор пропускает это без ошибок?
     
  2. wasm_test

    wasm_test wasm test user

    Публикаций:
    0
    Регистрация:
    24 ноя 2006
    Сообщения:
    5.582
    Так делать нельзя, потому что ты создаешь вторую директорию импорта, фактически, которая, есесно, не обрабатывается. Дойдя до нулевого элемента первой директории, лоадер винды решает, что это конец и пора бы запускать файл.
    Пропускает без ошибок, потому что это макрос, а не инструкция, и никаких проверок в нем нету. Рассчитывали, что писать будут правильно :derisive:
    В доказательство сказанного - если аккуратно посмотреть, то вместо адреса функции в импорте будет спокойно лежать RVA имени функции, то есть вторую директорию импорта лоадер и не трогал вовсе.
    Кстати, скомпилировал он все правильно :derisive:
     
  3. Nata

    Nata New Member

    Публикаций:
    0
    Регистрация:
    23 фев 2006
    Сообщения:
    41
    Плохо видимо читал материалы!А хде тут экспорт!?Загляни ещё раз в папку fasm\EXAMPLES\DLL
     
  4. wasm_test

    wasm_test wasm test user

    Публикаций:
    0
    Регистрация:
    24 ноя 2006
    Сообщения:
    5.582
    Nata
    он про импорт уже говорит судя по всему)
     
  5. l_inc

    l_inc New Member

    Публикаций:
    0
    Регистрация:
    29 сен 2005
    Сообщения:
    2.566
    Nata
    Дык пару часов просидел, сравнивая, чего же у меня не так как там. Но когда различий чуть больше, чем одно, то нужное различие не сразу бросается в глаза (особенно если уверен, что как раз здесь у тебя все правильно)
    :)
    Ну... там же, где и EntryPoint (да и вообще вся секция кода) и директива format PE GUI 4.0 DLL и т.п. : за пределами поста #1.
    Great
    Большое спасибо. Бум знать. А то я уже собрался разочаровываться в fasm'е, еще не начав с ним работать.
     
  6. l_inc

    l_inc New Member

    Публикаций:
    0
    Регистрация:
    29 сен 2005
    Сообщения:
    2.566
    И еще вопрос dazu, чтобы тему новую не создавать. Точнее скорее еще одна попытка пожаловаться на документацию к fasm'у. В manual'е написано
    При этом совсем не написано, что если, например, переменная char db 224 объявлена локальной внутри процедуры, то компилятор на mov bx,char говорит "invalid value". И теперь надо извращаться с помощью lea bx, [char], т.е. грубо говоря: сначала разыменовываем указатель, а потом опять получаем адрес. Почему бы для локальных переменных не сделать mov bx,char тоже валидной инструкцией?
    To recapitulate:
    Например есть такой код:
    Код (Text):
    1. proc Msg
    2.      ;locals
    3.         char dw 0C089h
    4.      ;endl
    5.      invoke MessageBox,0,char,0,MB_ICONERROR+MB_OK
    6.      ret
    7. endp
    Стоит мне раскомментировать locals и endl, как перед вызовом MessageBox становится необходимым добавлять лишнюю строку lea eax, [char], а вызов делать уже с параметром eax, а не char. Зачем?
     
  7. wasm_test

    wasm_test wasm test user

    Публикаций:
    0
    Регистрация:
    24 ноя 2006
    Сообщения:
    5.582
    потому что локальная переменная на самом деле представляет собой выражение вида EBP-CONST, т.к. располагается в кадре стека.
    поэтому и MOV EAX, EBP-CONST не катит (невалидная инструкция), но LEA EAX, [EBP-CONST] катит, как косвенная адресация.
     
  8. l_inc

    l_inc New Member

    Публикаций:
    0
    Регистрация:
    29 сен 2005
    Сообщения:
    2.566
    Great
    Но раз это в документации не описано, то можно подумать, что компилятор переформирует mov eax,ebp-const в какой-нибудь
    Код (Text):
    1. mov eax, ebp
    2. sub eax, const
    ну или мало ли во что еще... главное чтобы документация соответствовала действительности.
     
  9. wasm_test

    wasm_test wasm test user

    Публикаций:
    0
    Регистрация:
    24 ноя 2006
    Сообщения:
    5.582
    l_inc
    если бы он так преобразовывал, это был бы просто ужас. пишешь одну инструкцию, а генерится совсем другая. а вдруг я рассчитывал на mov? уж лучше ничего не делать, чем делать так ) как, собственно, разработчики фасма и поступили.
    в любом случае в одну инструкцию запихнуть в стек разность EBP и смещения не выйдет )
     
  10. Quantum

    Quantum Паладин дзена

    Публикаций:
    0
    Регистрация:
    6 янв 2003
    Сообщения:
    3.143
    Адрес:
    Ukraine
    l_inc
    Разочаровываться можно в макросах (library в данном случае), но не в бедном препроцессоре, который не виноват, что на него повесили кривой (ну, это тоже спорно...) макрос. Вообще, если бы фасм не обладал таким навороченным (по сравнению с масмом) препроцессором, проблем с макросами было бы меньше.
     
  11. Asterix

    Asterix New Member

    Публикаций:
    0
    Регистрация:
    25 фев 2003
    Сообщения:
    3.576
    Quantum
    но кое-что, то что умеет масм, фасм не умеет, обещали в версии 2.x :)
     
  12. Quantum

    Quantum Паладин дзена

    Публикаций:
    0
    Регистрация:
    6 янв 2003
    Сообщения:
    3.143
    Адрес:
    Ukraine
    Asterix
    Ты имеешь ввиду препроцессор или ассемблер вообще? Если препроцессор, то ссылки под рукой нет? Что-то я там на форуме ничего такого не вижу. А до 2го фасма ещё дожить надо :)
     
  13. Y_Mur

    Y_Mur Active Member

    Публикаций:
    0
    Регистрация:
    6 сен 2006
    Сообщения:
    2.494
    Quantum
    В препроцессоре fasm нет:
    - макрофункций
    - посимвольного разбора строк (в масме он тоже не ахти реализован, но всё таки есть :)
    из-за этих "мелочей" никак не могу назвать фасмовский препроцессор более удобным чем масмовский ;)
     
  14. asmfan

    asmfan New Member

    Публикаций:
    0
    Регистрация:
    10 июл 2006
    Сообщения:
    1.004
    Адрес:
    Abaddon
    Этого и не будет AFAIK т.к. противоречит концепции фасма.
    Честно, даже и не знаю где это могло бы использоваться, match вполне хватает.
     
  15. Asterix

    Asterix New Member

    Публикаций:
    0
    Регистрация:
    25 фев 2003
    Сообщения:
    3.576
    Quantum

    например вот такую штуку в фасме не сделаешь
    Код (Text):
    1. $invoke MACRO vars:VARARG
    2.      invoke vars
    3.      EXITM <eax>
    4. ENDM
    обещано вроде в 2.0, хотя может планы уже и изменились
     
  16. asmfan

    asmfan New Member

    Публикаций:
    0
    Регистрация:
    10 июл 2006
    Сообщения:
    1.004
    Адрес:
    Abaddon
    EXITM действительно нет, но все макросы invoke в фасме так и построены на VARARG'ах.
     
  17. Y_Mur

    Y_Mur Active Member

    Публикаций:
    0
    Регистрация:
    6 сен 2006
    Сообщения:
    2.494
    asmfan
    лично мне макрофункций и возможности выдёргивать из параметра ту подстроку которую мне нужно, а не ту которую match навязывает очень сильно не хватает :dntknw:. Сначала думал вот с объединением данных (чтобы они с кодом не смешивались) разберусь и начну вовсю fasmом пользоваться, ан не тут то было - всё равно жутко не удобно - короче не нашёл я в нём хвалёной свободы самовыражения - масм рулёз :) (хотя и слегка тормоз)
     
  18. PaCHER

    PaCHER New Member

    Публикаций:
    0
    Регистрация:
    25 мар 2006
    Сообщения:
    852
    Раз пошло обсуждение фасма.
    Там можна хоть както втолдычить ему, чтоб он выдавал сразу все ошибки а не только первую?
    Он может собирать дебаг версии програм?
     
  19. asmfan

    asmfan New Member

    Публикаций:
    0
    Регистрация:
    10 июл 2006
    Сообщения:
    1.004
    Адрес:
    Abaddon
    Что-то вроде, *первую не хочу исправлять, исправлю-ка вторую*)))?
    Неа, помойму.
    А вообще катайте-ка Томазу прошения, мож в обозримом будущем появится что-то подобное...
     
  20. PaCHER

    PaCHER New Member

    Публикаций:
    0
    Регистрация:
    25 мар 2006
    Сообщения:
    852
    Нет, при рипе большего участка кода ты полгода будеш таким пошаговым методом ошибки фиксить.