Отдыхая, вспомнил, что хотел написать реализацию перегрузки функций для фасм. Написал по мотивам манглинга имён в VС++, полная поддержка в принципе реализуема, но это тема для другого раза. Получилось, правда, грубовато - надо вспомнить, как покрасивее обрабатывать макро-списки. И есть ограничение: функции должны быть объявлены перед использованием их вне функций (см. сорец). Но дема работает, а там посмотрим, может и пригодится. -- Обновил макросы: добавил проверку на пустые аргументы, исправляющую ошибку при 0 и 1 аргументах.
это только у меня такое что при следующем коде не работает: Code (Text): proc na overload ;define function with no args. MessageBox(0,0,"0",0) ret endp proc na overload a ;define function with one arg. MessageBox(0,0,"1",0) ret endp эти функции макрос вопринимает как одинаковые по кол ву аргументов. Исправить это возможно, или прийдёться заново всё переписывать?
EvilsInterrupt Здрасьте, в с++ перегрузка - большой плюс. Почему не использовать её в асме? dead_body Да, есть проблема, когда 1 аргумент. Посмотрю завтра.
IceStudent Было бы неплохо. А то я свои макросы на синтаксис доделал, начал тестировать и вот вылезла такая бяка нехорошая. Хотелось бы, что бы если к примеру есть фунция только на 2 аргумента, а мы вызваем с одним, то она вызывалась, а не писала ошибку. Что бы не было такой жесткой привязаности... только как это сделать.
dead_body А как узнать, какую функцию вызывать? Если есть, например, перегрузки с 2 и 3 аргументами, а передаётся 1. Как выбирать? Если перегрузки вообще нет, тогда понятно - просто идёт вызов, а дальнейшее на совести писателя. [off] Кстати, раньше был против твоего синтаксиса - слишком на HLL похоже. Но потом всё больше стал замечать, что лень писать каждый раз invoke [/off]
Ещё идея: чтобы можно было вызывать напрямую перегруженные функции (по скорректированному имени). Но для этого нужно разбирать идентификатор имени по символам. Такое возможно в фасме?
Частично. Возможно разбивать строку на подстроки, но при этом в строке должны бть специальные сиволы. То есть строку вида: "ab" мы на "a" и "b" разбить не можем, но строку вида: "a+b" мы можем разбить на "a" и "b". Напиши на примере, точнее, что надо. Как мне кажеться многим будет интересна перегрузка функций, если её сделать хорошо, что бы она только добавляла возможности, при этом не урезая старый добрый асм. IceStudent Я вот думаю, надо бы собрать в одно все макросы фасма интересные и сделать бы к ним описание, и выложить бы.
Ага.. Это по поводу прямого вызова: нужно проверить, не скорректированное ли имя передаётся в invoke. Если это так, то вызывать его напрямую, иначе корректировать и вызывать перегруженную или обычную версию. Надо бы Те, что использую - я и так кладу в одно место, иногда добавляя "how to usage". А остальные — просто валяются в архивах.
Гм.. А прямой вызов, оказывается, и так работает: Code (Text): ; direct call na(x) push eax invoke na@@YGII@Z Интересно.. -- А, он же не считается перегруженным, поэтому и вызывается сразу.