Помогите советом. Парадигмы программирования и тп.

Тема в разделе "WASM.BEGINNERS", создана пользователем LaoFremda, 21 июн 2010.

  1. LaoFremda

    LaoFremda New Member

    Публикаций:
    0
    Регистрация:
    4 ноя 2009
    Сообщения:
    13
    Есть идея написать относительно большую программу на асме, скажем, больше 20 000 строк. Хочу кроссплатформенный API, но готовых к использованию с асмом не знаю. Пока остановил свой выбор на winapi + ogl. Поделитесь советами как приступить к такому делу? Боюсь, на каком-нибудь этапе код "сломается под своим весом" . Есть ли смысл пытаться делать ООП в асме? Лучше разбить прогу по нескольким DLL или писать все в один файл? хмм.. У меня, наверное, фантазии не хватит метки придумывать...

    И заодно подскажите как в фасме сделать один исполняемый файл из нескольких .asm? А то неудобно -- пишу процедуру в начале файла -> надо добавить переменные -> ползу несколько сотен строк вниз -> добавляю переменные в нужную секцию -> обратно несколько сотен строк. Вот бы отдельный асм файл для каждой процедуры, чтобы перменный были рядом. А при компилиривании код сам идет в свою секцию, данные в свою.
     
  2. baldr

    baldr New Member

    Публикаций:
    0
    Регистрация:
    29 апр 2010
    Сообщения:
    327
    Кроссплатформенный ассемблерный код? Попахивает оксюмороном.

    Код-то вряд ли, а вот автор — возможно. :derisive:

    Если есть осмысленные объекты — вполне достойный подход. Полиморфизм позволяет упростить кодирование для сходной обработки концептуально похожих объектов.

    Это весьма сильно зависит от структуры алгоритма. Если есть слабо связанные компактные блоки — модульность имеет смысл.

    Можно использовать структурные макро (.if, .while, .repeat) или сочинить свои. Анонимные метки тоже упрощают задачу.

    FASM умеет компилировать в COFF. Хотя при правильных атрибутах секции можно спокойно перемешивать код и данные: не догма ведь что их надо разводить по углам ринга (правда это делает использование памяти не очень оптимальным, но для программы в 20 килострок это вряд ли критично).
     
  3. qqwe

    qqwe New Member

    Публикаций:
    0
    Регистрация:
    2 янв 2009
    Сообщения:
    2.914
    LaoFremda
    это действительно стоящая идея. обязательно реализуйте ее. даже помогу вам

    include 'win32ax.inc'

    .data

    bgn db "сел иван васильевич на коня", 0

    .code
    run:
    mov eax, "топ-"
    mov eax, "топ-"
    mov eax, "топ-"
    mov eax, "топ-"
    mov eax, "топ-"
    mov eax, "топ-"
    mov eax, "топ-"
    mov eax, "топ-"
    mov eax, "топ-"
    ;...
    ; повторяйте так еще 20000 или больше раз
    ;...
    mov eax, "топ-"
    mov eax, "топ-"
    mov eax, "топ-"
    mov eax, "топ-"

    xor eax,eax
    ret

    .data

    fin db "слез иван васильевич с коня", 0

    .end run

    вообще то лучше затачиваться не на длину, а на осмысленность задачи
     
  4. qqwe

    qqwe New Member

    Публикаций:
    0
    Регистрация:
    2 янв 2009
    Сообщения:
    2.914
    LaoFremda
    а вы пользуйтесь способом дали. знаете, как он свои картины называл?
    "рука дали рисующая тучку пролетающую над стоящем на одной ножке стулом, на котором лежат кривые часы. но вобще-то это портрет кролика, который не получился"
     
  5. K10

    K10 New Member

    Публикаций:
    0
    Регистрация:
    3 окт 2008
    Сообщения:
    1.590
    Вроде fasm это не умеет, хотя кто-то придумывал какие-то макросы.
    А чем вам masm не угодил?
     
  6. Y_Mur

    Y_Mur Active Member

    Публикаций:
    0
    Регистрация:
    6 сен 2006
    Сообщения:
    2.494
    K10
    Гы - он на кросспалатформенность замахнулся :))
    http://www.wasm.ru/forum/viewtopic.php?id=20182

    LaoFremda
    Да есть - его ровно столько же сколько в попытке сделать на асме кроссплатформенный проект :). Результата - в смысле более менее нормально работающей проги всё равно не будет ;)
    Зато придёт понимание как делается ООП и чем достигается кросплатформенность, и почему там некоторые тонкости, которые совсем не очевидны когда смотришь из hi level.
     
  7. FLASH300

    FLASH300 New Member

    Публикаций:
    0
    Регистрация:
    30 окт 2008
    Сообщения:
    72
    include 'MiFunc.asm' Теоретически для этой цели достаточно.
     
  8. LaoFremda

    LaoFremda New Member

    Публикаций:
    0
    Регистрация:
    4 ноя 2009
    Сообщения:
    13
    А что если интересует только кросплатформенность между никсами и виндой на х86-32? Естественно несколько строк будут различатся, но если апиколлы будут работать без измененний, опкоды тоже одинковые... Разницы не так и много. 100 разных строк на 10 000 кода, вполне разумная плата за кроссплатформенность. Проблема только найти апи.

    Весь файл MiFunc.asm попадет именно туда, где написана эта строка. А я всё-таки хочу отдельную секцию для кода, отдельную для данных.
     
  9. jabocrack

    jabocrack New Member

    Публикаций:
    0
    Регистрация:
    27 мар 2010
    Сообщения:
    96
    LaoFremda
    Ориентируйся на rt-library кросс-платформенных си-компиляторов.
     
  10. FLASH300

    FLASH300 New Member

    Публикаций:
    0
    Регистрация:
    30 окт 2008
    Сообщения:
    72
    И что мешает разместить в отдельных файлах данные и код ?

    Код (Text):
    1. .data
    2.  
    3. fin db "слез иван васильевич с коня", 0
    4.  
    5. .code
    В масме это работает а в фасме нет ?

    + Еще макросы
     
  11. Y_Mur

    Y_Mur Active Member

    Публикаций:
    0
    Регистрация:
    6 сен 2006
    Сообщения:
    2.494
    LaoFremda
    и что мешает include MyData.asm' разместить в секции данных?
    и макросы по ссылке выше посмотри - они рабочие.

    или прячь системозависимый вызов осевых функций в макросы.
     
  12. baldr

    baldr New Member

    Публикаций:
    0
    Регистрация:
    29 апр 2010
    Сообщения:
    327
    В FASMе это работает если компилировать в COFF. Тогда линкер соберёт отдельные фрагменты секций вместе.
     
  13. qqwe

    qqwe New Member

    Публикаций:
    0
    Регистрация:
    2 янв 2009
    Сообщения:
    2.914
    о, мой суперкод на много к строк уже принят к использованию. эх, зря я на него копирайт сразу не навесил.. или может поделитесь всетаки гонораром? я еще таких триков и хаков знаю


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

    int a, b; // переменные в .bss

    int m[] = {a, b}; // это уже .data

    те релоки на ссылки из даты на бсс.

    не нашел даже самих этих релоков.

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

    впрочем, надеюсь не сильно. работы много. работа непростая. работа не для новичка. баксами я не шуршу. права качать не получится.
     
  14. Rockphorr

    Rockphorr Well-Known Member

    Публикаций:
    0
    Регистрация:
    9 июн 2004
    Сообщения:
    2.622
    Адрес:
    Russia
    LaoFremda
    Идею бросьте за бесперспективностью. Желание кросплатформенности подавите.
     
  15. baldr

    baldr New Member

    Публикаций:
    0
    Регистрация:
    29 апр 2010
    Сообщения:
    327
    Имелось в виду «int *m[] = {&a, &b};»?
     
  16. qqwe

    qqwe New Member

    Публикаций:
    0
    Регистрация:
    2 янв 2009
    Сообщения:
    2.914
    baldr
    да. я ошибся.
    в принципе, не исключено, что это была проблема не моя, а линкера и в свежих версиях этот момент пофиксили. я строил поверх 1.6. но, вообще, хотелось бы найти место, где в ячейки (код/дата) под ссылки на бсс забрасываются реальные адреса. (блин, хотел показать рамки, а си не открывается. может потом, не выйдет щас перегрузиться)
     
  17. LaoFremda

    LaoFremda New Member

    Публикаций:
    0
    Регистрация:
    4 ноя 2009
    Сообщения:
    13
    Как уже было сказано, фасм не соберет всё в одну секцию и будет 100 секций в одном файле. А использовать COFF мне религия не позволяет.

    Это же простое собирание данных в отдельном инклуде. Совсем не похоже на идеал, когда данные рядом с функцией в одном файле на одной странице.
    Макросы посмотрел, с ними немного лучше.

    Можно пример такой rt-library?

    Сегодня весь день разбирался с ООП. Это ужасно! Никакой наглядности. Обращение к методам/переменным всё через регистры, метки почти не используются. Как представлю себе 10 классов, каждый с виртуальными методами, как надо помнить смещение каждого указателя... Пропадает желание писать в ООП.
     
  18. qqwe

    qqwe New Member

    Публикаций:
    0
    Регистрация:
    2 янв 2009
    Сообщения:
    2.914
    LaoFremda
    для фасма есть много разных уже написанных макросов. некоторые позволяют мешать код и данные, а по секциям раскидывают уже они сами. выбирайте по себе или учите фасм макро язык. все равно прийдется, а это самое легкое из того, что вы задумали

    так и не пишите. а в реализации ооп нет ничего сложного.

    в варианте с выключеным оптимизатором, класс реализуется в виде структуры с данными и указателями на виртуальные методы (прямо в той же структуре или в виде отдельной структуры).
    ясен пень, что для доступа к частям этой структуры надо получить сперва адрес самой структуры, а затем, по смещению в ней (структуре) брать данные/адреса виртуалок
    обычные (не виртуальные) методы реализуются и вызываются как обычные функции.

    не виртуальный полиморфизм получается очень просто - название каждой функции - это шифр из ее имени, ее класса, ее параметров и ее возвратов. те
    int add(int, int);
    int add(int, float);
    float add(int, int);
    это разные функции с разными именами.

    виртуальный полиморфизм достигается через ссылки. те
    struct class_name {
    int (*add) (...);
    }

    естественно, что компилеры это дело оптимизируют и могут вырождать или сливать классы, но то уже к ооп не имеет никакого отношения. точно также происходит и с не ооп яву.
     
  19. qqwe

    qqwe New Member

    Публикаций:
    0
    Регистрация:
    2 янв 2009
    Сообщения:
    2.914
    ..ну а шаблоны реализуются подобно макросам, те нужные функции автоматически досоздаются в процессе компиляции.
     
  20. Y_Mur

    Y_Mur Active Member

    Публикаций:
    0
    Регистрация:
    6 сен 2006
    Сообщения:
    2.494
    LaoFremda
    Улыбнуло :))
    В асме ООП означает написание собственных удобных макросов, повышающих наглядность программы за счёт того, что она становится похожей на высокоуроневую прогу с ООПом. Есно никакого ручного залазиния в потроха этих макросов при каждом их использовании не нужно - раз написал, отладил и пользуйстя на здоровье :). Кстати ты не обязан повторять внутри своей проги ту реализацию ООП, которую делают hilevel компиляторы, делай свою альтернативную - которая будет радовать именно тебя ;).
    Тут кажется тема такого ООП на fasme с кучей готовых макросов когда-то была, поищи.
    Я с этим только на масме игрался.

    ЗЫ: хотя как я уже упоминал выше смысл этого извращения только в том, чтобы набраться опыта, пытаясь понять тонкости ООП "изнутри" методом собственных проб и ошибок, это даёт более глубокое понимание, чем просто просмотр или копипаст ООП кода созданного чужим компилятором. До рабочей программы это довести мне не удалось и пока на знаю того кому удалось.

    ЗЗЫ: А передача параметров через регистры это не хорошо, а ооочень хорошо :))