Как лучше реализовать ООП в FASM? Мне кажется, что S_T_A_S это может знать. Хочу писать что-то вроде этого: Код (Text): ; class declaration Class SimpleMessenger .btns rd 1 Static .caption du "A Caption", 0 Method Show, text Endclass ; class implementation Proc SimpleMessenger.Show, text Begin MessageBox 0, [text], SimpleMessenger.Caption, this.btns Return Endproc ; class usage Mov [Sm.btns], MB_OK + MB_ICONINFORMATION Sm.Show szText ; ... Sm SimpleMessenger Обращайте внимание на объявление класса и его экземпляра, макросом Proc-Begin-Return-End я давно пользуюсь. Пробовал сам написать макрос, но мозги вывихнул. Как из макроса определить другой макрос я понял, а здесь получается, что Class определяет новый макрос SimpleMessenger, а тот, в свою очередь определяет макрос Sm.Show, который просто вызывает SimpleMessenger.Show. И вообще, это возможно, или нет?
Как это сделать лучше я не знаю . Попытки были, вот нашел на винте старые файлики, может быть пригодятся (может быть я их уже и выкладывал) Там 2 варианта, степень готовности 2го меньше, чем первого, но он более "продвинутый" Наибольший интерес будут представлять файлы class.inc (они разые) ещё - Wnd.asm от которого "наследуются" Console.asm и DDraw.asm Для компиляции примеров 2nd.Asm нужно положить в папки APIA и т.д inc файды от страрого fasm (до 1.55) Потом я отказался от этого, начал использовать обычные struc - пример есть здесь см. frame_window. В настоящий момент я склоняюсь к мысли, что по-хорошему это должно быть частью компилятора, а не надстройкой из макросов, т.к при увеличении размеров проекта скорость компиляции заметно снижается. Что из этой мысли получится, пока судить рано, потому что на данный момент у меня препроцессор и парсер готовы на 85%, а лексер и кодогенератор где-то на 5%, а может и того меньше . _158450587__fasm.rar
" у меня препроцессор и парсер готовы на 85%" Что это значит, ты ассемблер пишешь что ли? по-хорошему это должно быть частью компилятора Я тоже так считаю, потому что если учесть все желаемые возможности, то получится модель, сильно отличающаяся от существующей модели макросов.
Компилятор ассемблера, конечно, хотелось бы написАть, но для этого одного желания мало Одна из основных задач - совместимость с Си хотя бы на уровне хидеров (препроцессор совместим, хотя есть и отличия), так что синтаксис объявления структур и данных будет заимстван оттуда. Можно конечно взять какой-нибудь LCC и "дорабатать" до front-end к FASM, однако это не кажется мне дзенным решением - пишу по принципу "не догоню, так согреюсь", то есть основной целью ставлю не написание самого компилятора, а получение новых знаний, так что процесс продвигается довольно медленно (последние 2 недели я совсем не прикасался) Зато с названием проблем похоже нет )))
Возможно так будет удобней. Объявление макросов и констант для работы с классами: Код (Text): m_ fix { mc fix macro cmn fix common macro CreateClass Namel { __CUR_NAME fix Namel Namel: };CreateClass ;endm macro CreateMetod Name,[varName,type] { common local .loclab mc __CUR_NAME#.#Name [valueName] m_ jmp .loclab forward .#varName type valueName,0 common .loclab: };CreateMetod ;endm EndMetod fix } EndCreateClass equ Создание класса: Код (Text): CreateClass MessErr .Capt db 'Îøèáêà ïðîãðàììû',0 .Text db 'Âñ¸ ïðîøëî',0 CreateMetod Show,text,db invoke MessageBox,0,.text,MessErr.Capt,MB_OK EndMetod EndCreateClass EndCreateClass можно опустить ничего страшного не произойдёт, он просто для красоты. Использование: Код (Text): MessErr.Show 'Firster' Создавать несколько классов не получается, пока. Может придумает как создать несколько классов, в смысле, что поправить.
Я в масме юзаю вот такое. Не очень-то и ООП, но помогает. Код (Text): object Macro f,p:VARARG LOCAL obj LOCAL poz LOCAL txt, arg txt TEXTEQU <> FOR arg, <p> txt CATSTR <arg>, <!,>, txt ENDM txt SUBSTR txt, 1, @SizeStr( %txt ) - 1 txt CATSTR <!<>, txt, <!>> % poz INSTR 1,<f>,<.> obj SUBSTR <f>, 1, poz-1 % FOR arg, txt push arg ENDM push offset obj call f endm ROLL_LIST struct rl_data dd ? lb_handle dd ? rl_list dd ? rl_font dd ? ;methods add_to dd ? delete dd ? clear dd ? release dd ? ;events on_click dd ? ROLL_LIST ends .data? test0 ROLLLIST <> .code .... m2m test0.rl_font,my_font m2m test0.lb_handle,list_h mov test0.on_click, offset rl_clicked invoke new_object,addr test0, TYPE_ROLLLIST;заполнение методов в зависимомти от типа ... object test0.add_to,offset text_str,5 ... rl_add_to proc obj:DWORD,s:DWORD,i:DWORD ... ret rl_add_to endp
pas Главное, чего я хочу, - это отделить объявление класса от объявления его экземпляра, а в идеале ещё и от его реализации.