модульность программ

Тема в разделе "WASM.BEGINNERS", создана пользователем rewo, 15 окт 2006.

  1. rewo

    rewo New Member

    Публикаций:
    0
    Регистрация:
    28 сен 2006
    Сообщения:
    14
    из-за громоздкости программы мне удобнне куски было бы раскидать по отдельным файлам
    то есть в каждом описать отдельную веткупрограммы

    как мне это лучше организовать?

    то есть идет код... где-то посередине вызывается функция описанная в отдельном файле...
     
  2. Quantum

    Quantum Паладин дзена

    Публикаций:
    0
    Регистрация:
    6 янв 2003
    Сообщения:
    3.143
    Адрес:
    Ukraine
    Эта уже стала сильно громоздкой? :)

    Что мешает разложить функции по разным *.asm файлам? Потом эти файлы можно либо компилировать индивидуально и получить несколько обьектников, либо заинклудить их все в основной файл и компилировать только его.
    Код (Text):
    1. ; file1.asm
    2. include file2.asm
    3. include file3.asm
    4. ; ***
     
  3. IceStudent

    IceStudent Active Member

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

    rewo New Member

    Публикаций:
    0
    Регистрация:
    28 сен 2006
    Сообщения:
    14
    это загвоздка в коде :)
    а потом как собирать объекты?
     
  5. IceStudent

    IceStudent Active Member

    Публикаций:
    0
    Регистрация:
    2 окт 2003
    Сообщения:
    4.300
    Адрес:
    Ukraine
    link file1.obj file2.obj filex.obj
     
  6. Quantum

    Quantum Паладин дзена

    Публикаций:
    0
    Регистрация:
    6 янв 2003
    Сообщения:
    3.143
    Адрес:
    Ukraine
    IceStudent
    Размер экзешника может вырасти из-за выравнивания сегментов обьектников. Чем больше обьектников, тем больше шансов, что размер экзешника увеличится. Все глобальные символы (переменные, функции) нужно явно указывать как extern в каждом файле, который их использует (или в каком-то общем инклуде). Поэтому я предпочитаю второй вариант, хотя это уже не совсем модульность получается.
     
  7. Everon

    Everon Ronny

    Публикаций:
    0
    Регистрация:
    5 авг 2006
    Сообщения:
    8
    IMHO, вариант с инклудами + хорошие комментарии (я даже в каждом ASM-файле прописываю имя файла, в который он включается) - это найлучший вариант. Ну а если файлов совсем много, то можно и по каталогам разложить =)
     
  8. IceStudent

    IceStudent Active Member

    Публикаций:
    0
    Регистрация:
    2 окт 2003
    Сообщения:
    4.300
    Адрес:
    Ukraine
    Quantum
    Почему? Если сегменты разные, то да. Если же объявляется один сегмент (.text$*, .data$*), то он объединяется тоже в один. Это ведь прямая работа линкера.

    Ну да. Что в этом плохого? Или лучше постоянно следить за тем, чтобы нужная функция была выше, чем она вызывается (если использовать invoke, а не call)?

    Everon
    :)
     
  9. Quantum

    Quantum Паладин дзена

    Публикаций:
    0
    Регистрация:
    6 янв 2003
    Сообщения:
    3.143
    Адрес:
    Ukraine
    IceStudent
    Адреса сегментов выравниваются даже после обьединения. Если у меня в начале сегмента .text в каком-то из обьектников идёт функция F, то адрес этой функции должен быть кратен выравниванию сегмента (1 - 16 байт), не зависимо от того, попадёт ли этот сегмент в начало секции экзешника, или где-то посередине. Поэтому линкер запихивает лишние байты между сегментами обьектников внутри одной секции экзешника. Чем больше обьектников, тем больше мусора затолкает туда линкер. Конечно, если размеры всех сегментов (кроме последнего) кратны выравниванию, мусора не будет совсем, но это очень редкий случай.

    Ну, я invoke вообще стараюсь не юзать, но те, кто юзает, конечно, должны это учитывать.