fasm: упражнения в макро

Тема в разделе "WASM.ASSEMBLER", создана пользователем IceStudent, 13 ноя 2006.

  1. IceStudent

    IceStudent Active Member

    Публикаций:
    0
    Регистрация:
    2 окт 2003
    Сообщения:
    4.300
    Адрес:
    Ukraine
    Отдыхая, вспомнил, что хотел написать реализацию перегрузки функций для фасм.

    Написал по мотивам манглинга имён в VС++, полная поддержка в принципе реализуема, но это тема для другого раза.

    Получилось, правда, грубовато - надо вспомнить, как покрасивее обрабатывать макро-списки. И есть ограничение: функции должны быть объявлены перед использованием их вне функций (см. сорец). Но дема работает, а там посмотрим, может и пригодится.

    --
    Обновил макросы: добавил проверку на пустые аргументы, исправляющую ошибку при 0 и 1 аргументах.
     
  2. dead_body

    dead_body wasm.ru

    Публикаций:
    0
    Регистрация:
    3 сен 2004
    Сообщения:
    603
    Адрес:
    Украина;г.Харьков;г.Н.Каховка
    это только у меня такое что при следующем коде не работает:
    Код (Text):
    1. proc na overload                        ;define function with no args.
    2.      MessageBox(0,0,"0",0)
    3.      ret
    4. endp
    5. proc na overload a                      ;define function with one arg.
    6.      MessageBox(0,0,"1",0)
    7.      ret
    8. endp
    эти функции макрос вопринимает как одинаковые по кол ву аргументов.
    Исправить это возможно, или прийдёться заново всё переписывать?
     
  3. EvilsInterrupt

    EvilsInterrupt Постигающий азы дзена

    Публикаций:
    0
    Регистрация:
    28 окт 2003
    Сообщения:
    2.428
    Адрес:
    Russia
    IceStudent
    Уйди вон извращенец! :)))
     
  4. IceStudent

    IceStudent Active Member

    Публикаций:
    0
    Регистрация:
    2 окт 2003
    Сообщения:
    4.300
    Адрес:
    Ukraine
    EvilsInterrupt
    Здрасьте, в с++ перегрузка - большой плюс. Почему не использовать её в асме?

    dead_body
    Да, есть проблема, когда 1 аргумент. Посмотрю завтра.
     
  5. dead_body

    dead_body wasm.ru

    Публикаций:
    0
    Регистрация:
    3 сен 2004
    Сообщения:
    603
    Адрес:
    Украина;г.Харьков;г.Н.Каховка
    IceStudent
    Было бы неплохо. А то я свои макросы на синтаксис доделал, начал тестировать и вот вылезла такая бяка нехорошая.


    Хотелось бы, что бы если к примеру есть фунция только на 2 аргумента, а мы вызваем с одним, то она вызывалась, а не писала ошибку. Что бы не было такой жесткой привязаности... только как это сделать.
     
  6. IceStudent

    IceStudent Active Member

    Публикаций:
    0
    Регистрация:
    2 окт 2003
    Сообщения:
    4.300
    Адрес:
    Ukraine
    dead_body
    А как узнать, какую функцию вызывать? Если есть, например, перегрузки с 2 и 3 аргументами, а передаётся 1. Как выбирать? Если перегрузки вообще нет, тогда понятно - просто идёт вызов, а дальнейшее на совести писателя.

    [off]
    Кстати, раньше был против твоего синтаксиса - слишком на HLL похоже. Но потом всё больше стал замечать, что лень писать каждый раз invoke :)[/off]
     
  7. IceStudent

    IceStudent Active Member

    Публикаций:
    0
    Регистрация:
    2 окт 2003
    Сообщения:
    4.300
    Адрес:
    Ukraine
    Ещё идея: чтобы можно было вызывать напрямую перегруженные функции (по скорректированному имени). Но для этого нужно разбирать идентификатор имени по символам. Такое возможно в фасме?
     
  8. dead_body

    dead_body wasm.ru

    Публикаций:
    0
    Регистрация:
    3 сен 2004
    Сообщения:
    603
    Адрес:
    Украина;г.Харьков;г.Н.Каховка
    Частично. Возможно разбивать строку на подстроки, но при этом в строке должны бть специальные сиволы. То есть строку вида: "ab" мы на "a" и "b" разбить не можем, но строку вида: "a+b" мы можем разбить на "a" и "b".

    Напиши на примере, точнее, что надо.
    Как мне кажеться многим будет интересна перегрузка функций, если её сделать хорошо, что бы она только добавляла возможности, при этом не урезая старый добрый асм.

    IceStudent
    Я вот думаю, надо бы собрать в одно все макросы фасма интересные и сделать бы к ним описание, и выложить бы.
     
  9. IceStudent

    IceStudent Active Member

    Публикаций:
    0
    Регистрация:
    2 окт 2003
    Сообщения:
    4.300
    Адрес:
    Ukraine
    Ага.. Это по поводу прямого вызова: нужно проверить, не скорректированное ли имя передаётся в invoke. Если это так, то вызывать его напрямую, иначе корректировать и вызывать перегруженную или обычную версию.

    Надо бы :) Те, что использую - я и так кладу в одно место, иногда добавляя "how to usage". А остальные — просто валяются в архивах.
     
  10. IceStudent

    IceStudent Active Member

    Публикаций:
    0
    Регистрация:
    2 окт 2003
    Сообщения:
    4.300
    Адрес:
    Ukraine
    Гм.. А прямой вызов, оказывается, и так работает:
    Код (Text):
    1.     ; direct call na(x)
    2.     push    eax
    3.     invoke na@@YGII@Z
    Интересно..

    --
    А, он же не считается перегруженным, поэтому и вызывается сразу.
     
  11. dead_body

    dead_body wasm.ru

    Публикаций:
    0
    Регистрация:
    3 сен 2004
    Сообщения:
    603
    Адрес:
    Украина;г.Харьков;г.Н.Каховка
    поделиться не хоч?
     
  12. IceStudent

    IceStudent Active Member

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