Вопрос S_T_A_Sу: как лучше реализовать ООП в FASM?

Тема в разделе "WASM.ASSEMBLER", создана пользователем Foamplast, 12 дек 2004.

  1. Foamplast

    Foamplast New Member

    Публикаций:
    0
    Регистрация:
    6 ноя 2003
    Сообщения:
    80
    Адрес:
    Russia
    Как лучше реализовать ООП в FASM?

    Мне кажется, что S_T_A_S это может знать.



    Хочу писать что-то вроде этого:
    Код (Text):
    1.  
    2.  
    3. ; class declaration
    4.  
    5. Class SimpleMessenger
    6.  
    7.   .btns rd 1
    8.  
    9.   Static
    10.  
    11.   .caption du "A Caption", 0
    12.  
    13.   Method Show, text
    14.  
    15. Endclass
    16.  
    17. ; class implementation
    18.  
    19. Proc SimpleMessenger.Show, text
    20. Begin
    21.  
    22.   MessageBox 0, [text], SimpleMessenger.Caption, this.btns
    23.   Return
    24.  
    25. Endproc
    26.  
    27. ; class usage
    28.  
    29.   Mov  [Sm.btns], MB_OK + MB_ICONINFORMATION
    30.   Sm.Show szText
    31.  
    32. ; ...
    33.  
    34. Sm SimpleMessenger
    35.  
    36.  




    Обращайте внимание на объявление класса и его экземпляра, макросом Proc-Begin-Return-End я давно пользуюсь.



    Пробовал сам написать макрос, но мозги вывихнул. Как из макроса определить другой макрос я понял, а здесь получается, что Class определяет новый макрос SimpleMessenger, а тот, в свою очередь определяет макрос Sm.Show, который просто вызывает SimpleMessenger.Show.



    И вообще, это возможно, или нет?
     
  2. S_T_A_S_

    S_T_A_S_ New Member

    Публикаций:
    0
    Регистрация:
    27 окт 2003
    Сообщения:
    1.754
    Как это сделать лучше я не знаю :).

    Попытки были, вот нашел на винте старые файлики, может быть пригодятся (может быть я их уже и выкладывал)

    Там 2 варианта, степень готовности 2го меньше, чем первого, но он более "продвинутый"

    Наибольший интерес будут представлять файлы class.inc (они разые) ещё - Wnd.asm от которого "наследуются" Console.asm и DDraw.asm

    Для компиляции примеров 2nd.Asm нужно положить в папки APIA и т.д inc файды от страрого fasm (до 1.55)



    Потом я отказался от этого, начал использовать обычные struc - пример есть здесь см. frame_window.



    В настоящий момент я склоняюсь к мысли, что по-хорошему это должно быть частью компилятора, а не надстройкой из макросов, т.к при увеличении размеров проекта скорость компиляции заметно снижается.

    Что из этой мысли получится, пока судить рано, потому что на данный момент у меня препроцессор и парсер готовы на 85%, а лексер и кодогенератор где-то на 5%, а может и того меньше :).



    [​IMG] _158450587__fasm.rar
     
  3. Foamplast

    Foamplast New Member

    Публикаций:
    0
    Регистрация:
    6 ноя 2003
    Сообщения:
    80
    Адрес:
    Russia
    " у меня препроцессор и парсер готовы на 85%"



    Что это значит, ты ассемблер пишешь что ли?



    по-хорошему это должно быть частью компилятора



    Я тоже так считаю, потому что если учесть все желаемые возможности, то получится модель, сильно отличающаяся от существующей модели макросов.
     
  4. Asterix

    Asterix New Member

    Публикаций:
    0
    Регистрация:
    25 фев 2003
    Сообщения:
    3.576
    > Что это значит, ты ассемблер пишешь что ли?



    Я уже ему название придумал - STASm :)
     
  5. S_T_A_S_

    S_T_A_S_ New Member

    Публикаций:
    0
    Регистрация:
    27 окт 2003
    Сообщения:
    1.754
    Компилятор ассемблера, конечно, хотелось бы написАть, но для этого одного желания мало :dntknw:

    Одна из основных задач - совместимость с Си хотя бы на уровне хидеров (препроцессор совместим, хотя есть и отличия), так что синтаксис объявления структур и данных будет заимстван оттуда.

    Можно конечно взять какой-нибудь LCC и "дорабатать" до front-end к FASM, однако это не кажется мне дзенным решением - пишу по принципу "не догоню, так согреюсь", то есть основной целью ставлю не написание самого компилятора, а получение новых знаний, так что процесс продвигается довольно медленно (последние 2 недели я совсем не прикасался)

    Зато с названием проблем похоже нет :))))
     
  6. pas

    pas New Member

    Публикаций:
    0
    Регистрация:
    18 апр 2003
    Сообщения:
    330
    Адрес:
    Russia
    Возможно так будет удобней.

    Объявление макросов и констант для работы с классами:
    Код (Text):
    1.  
    2. m_ fix {
    3. mc fix macro
    4. cmn fix common
    5. macro CreateClass Namel
    6. {
    7. __CUR_NAME fix Namel
    8. Namel:
    9. };CreateClass
    10. ;endm
    11. macro CreateMetod Name,[varName,type]
    12. {
    13. common
    14. local .loclab
    15. mc __CUR_NAME#.#Name [valueName] m_
    16. jmp .loclab
    17. forward
    18. .#varName type valueName,0
    19. common
    20. .loclab:
    21. };CreateMetod
    22. ;endm
    23. EndMetod fix }
    24. EndCreateClass equ
    25.  


    Создание класса:
    Код (Text):
    1.  
    2. CreateClass MessErr
    3.             .Capt db 'Îøèáêà ïðîãðàììû',0
    4.             .Text db 'Âñ¸ ïðîøëî',0
    5.            
    6.        CreateMetod Show,text,db
    7.        
    8.               invoke MessageBox,0,.text,MessErr.Capt,MB_OK
    9.        EndMetod
    10. EndCreateClass
    11.  


    EndCreateClass можно опустить ничего страшного не произойдёт, он просто для красоты.

    Использование:
    Код (Text):
    1.  
    2. MessErr.Show 'Firster'
    3.  


    Создавать несколько классов не получается, пока.

    Может придумает как создать несколько классов, в смысле, что поправить.
     
  7. __Ranger

    __Ranger New Member

    Публикаций:
    0
    Регистрация:
    8 апр 2003
    Сообщения:
    23
    Адрес:
    Russia
    Я в масме юзаю вот такое. Не очень-то и ООП, но помогает.


    Код (Text):
    1.  
    2. object Macro f,p:VARARG
    3.     LOCAL obj
    4.     LOCAL poz
    5.     LOCAL txt, arg
    6.     txt TEXTEQU <>
    7.     FOR arg, <p>
    8.         txt CATSTR <arg>, <!,>, txt
    9.     ENDM
    10.     txt SUBSTR  txt, 1, @SizeStr( %txt ) - 1
    11.     txt CATSTR  <!<>, txt, <!>>
    12.    
    13.     % poz INSTR 1,<f>,<.>
    14.     obj SUBSTR <f>, 1, poz-1
    15.  
    16.     % FOR arg, txt
    17.         push arg
    18.     ENDM
    19.  
    20.     push offset obj
    21.     call f
    22. endm
    23.  
    24. ROLL_LIST struct
    25.     rl_data     dd ?
    26.     lb_handle         dd ?
    27.     rl_list     dd ?
    28.     rl_font     dd ?
    29. ;methods
    30.     add_to      dd ?
    31.     delete      dd ?
    32.     clear             dd ?
    33.     release     dd ?
    34. ;events
    35.       on_click          dd ?
    36. ROLL_LIST ends
    37.  
    38. .data?
    39. test0 ROLLLIST <>
    40.  
    41. .code
    42.  
    43. ....
    44. m2m test0.rl_font,my_font
    45. m2m test0.lb_handle,list_h
    46. mov test0.on_click, offset rl_clicked
    47. invoke new_object,addr test0, TYPE_ROLLLIST;заполнение методов в зависимомти от типа
    48. ...
    49. object test0.add_to,offset text_str,5
    50. ...
    51. rl_add_to proc obj:DWORD,s:DWORD,i:DWORD
    52. ...
    53. ret
    54. rl_add_to endp
    55.  
     
  8. Foamplast

    Foamplast New Member

    Публикаций:
    0
    Регистрация:
    6 ноя 2003
    Сообщения:
    80
    Адрес:
    Russia
    pas



    Главное, чего я хочу, - это отделить объявление класса от объявления его экземпляра, а в идеале ещё и от его реализации.