Медленные макросы FASM-а. Что делать?

Тема в разделе "WASM.ASSEMBLER", создана пользователем _DEN_, 31 мар 2005.

  1. _DEN_

    _DEN_ DEN

    Публикаций:
    0
    Регистрация:
    8 окт 2003
    Сообщения:
    5.383
    Адрес:
    Йобастан
    Столкнулся с проблемой в forward dll. Макросы import и/или export похоже имеют квадратичную сложность от размера строки. Пустая прога со всем импортом и экспортом кернела компилится две минуты на моем C3-1200. Что делать?
     
  2. S_T_A_S_

    S_T_A_S_ New Member

    Публикаций:
    0
    Регистрация:
    27 окт 2003
    Сообщения:
    1.754
    Вариант: заменить макросы тем, что они производят в конечном итоге (можно использовать perl).
     
  3. _DEN_

    _DEN_ DEN

    Публикаций:
    0
    Регистрация:
    8 окт 2003
    Сообщения:
    5.383
    Адрес:
    Йобастан
    S_T_A_S_

    А если без половых извращений? :derisive: В макросе export какая-то сортировка используется, и похоже пузырек. Его на qsort нельзя перевести?
     
  4. S_T_A_S_

    S_T_A_S_ New Member

    Публикаций:
    0
    Регистрация:
    27 окт 2003
    Сообщения:
    1.754
    Можно, наверное, но зачем? Сформируй раздел экспорта ручками через db. А чтобы не пыхтеть печатая каждую строчку, и нужен скрипт на пёрле. Подаёшь ему на вход fasm\INCLUDE\APIA\KERNEL32.INC и усё :derisive:



    Кста, какая версия fasm? В последних препроцессор быстее.
     
  5. S_T_A_S_

    S_T_A_S_ New Member

    Публикаций:
    0
    Регистрация:
    27 окт 2003
    Сообщения:
    1.754




    LOL =)
     
  6. shoo

    shoo New Member

    Публикаций:
    0
    Регистрация:
    17 июл 2003
    Сообщения:
    1.537
    Адрес:
    Ukraine
    попробуй сделать 2 длл - одна форвард, другая с контролируемой вункцией. форвард должна все запросы слать транзитом, а для контролируемой(ых) вызывать вторую, которую ты и будешь отлаживать, форвард скомпилишь только 1 раз, а вторая будет маленькой. может, типа, вариант...
     
  7. johnfound

    johnfound New Member

    Публикаций:
    0
    Регистрация:
    12 фев 2003
    Сообщения:
    74
    Адрес:
    Bulgaria
    Возможное решение: сделать "export" макрос чтобы не сортировал совсем, а сортировать експорты в сорсе вручную.



    Сделать qsort кажеться трудно потому что рекурсивно макросы вызывать в FASMe невозможно. Но можно попробовать некоторые итерационные варианты...наверное... :)
     
  8. _DEN_

    _DEN_ DEN

    Публикаций:
    0
    Регистрация:
    8 окт 2003
    Сообщения:
    5.383
    Адрес:
    Йобастан
    johnfound







    Да, мне эта сортировка нафиг не нужна. Люды добрые, дайте export без сортировки?...
     
  9. johnfound

    johnfound New Member

    Публикаций:
    0
    Регистрация:
    12 фев 2003
    Сообщения:
    74
    Адрес:
    Bulgaria
    Вот и сюрприз. Посмотрел сегодня в пакет Fresh, а там до сих пор старой вариант "export" живет, где сортировка вручную делается. Кажеться должен работать.


    Код (Text):
    1.  
    2. ; macroinstruction for making export section
    3.  
    4. macro export dllname,[label,string]
    5.  { common
    6.     local module,addresses,names,ordinal,count
    7.     count = 0
    8.    forward
    9.     count = count+1
    10.    common
    11.     dd 0,0,0,RVA module,1
    12.     dd count,count,RVA addresses,RVA names,RVA ordinal
    13.     addresses:
    14.    forward
    15.     dd RVA label
    16.    common
    17.     names:
    18.    forward
    19.     local name
    20.     dd RVA name
    21.    common
    22.     ordinal: count = 0
    23.    forward
    24.     dw count
    25.     count = count+1
    26.    common
    27.     module db dllname,0
    28.    forward
    29.     name db string,0 }
    30.  




    Кстати, знает ли кто нибудь, совсем ли ето обязательно, чтобы имена были сортированные?
     
  10. shoo

    shoo New Member

    Публикаций:
    0
    Регистрация:
    17 июл 2003
    Сообщения:
    1.537
    Адрес:
    Ukraine
    наверное, нет

    я сейчас попробовал этот макрос вместо того что был (правда, я не вникал ;)



    вот мой экспорт:
    Код (Text):
    1.   export 'INP2.DLL',\
    2.      GetWAAddInData,'GetWAAddInData',\
    3.      WAAddInLoad,'WAAddInLoad',\
    4.      WAAddInUnload,'WAAddInUnload',\
    5.      FrameWindowProc,'FrameWindowProc';,\


    работает нормально...

    может, так и оставлю ;)
     
  11. shoo

    shoo New Member

    Публикаций:
    0
    Регистрация:
    17 июл 2003
    Сообщения:
    1.537
    Адрес:
    Ukraine
    а вот и нет - FrameWindowProc потерялась: значит, сортировка нужна!
     
  12. shoo

    shoo New Member

    Публикаций:
    0
    Регистрация:
    17 июл 2003
    Сообщения:
    1.537
    Адрес:
    Ukraine
    johnfound

    кстати, мысль: я оставил оба макроса в export.inc, только второй переименовал в export_unsorted: мало ли, может, тоже пригодится в подобной ситуации.
     
  13. _DEN_

    _DEN_ DEN

    Публикаций:
    0
    Регистрация:
    8 окт 2003
    Сообщения:
    5.383
    Адрес:
    Йобастан
    johnfound

    Круто, все компилиться на ура)))) Спасибо!