Модульная организация программ на Fasm

Тема в разделе "WASM.BEGINNERS", создана пользователем HumanAPI, 15 июл 2007.

  1. HumanAPI

    HumanAPI New Member

    Публикаций:
    0
    Регистрация:
    23 июн 2007
    Сообщения:
    13
    Привет всем.
    Возможно ли на на Fasm организовать программу из нескольких файлов(модулей) с своими переменными и кодом(по типу как в MASM)
     
  2. censored

    censored New Member

    Публикаций:
    0
    Регистрация:
    5 июл 2005
    Сообщения:
    1.615
    Адрес:
    деревня "Анонимные Прокси"
    а в чем проблема?
     
  3. HumanAPI

    HumanAPI New Member

    Публикаций:
    0
    Регистрация:
    23 июн 2007
    Сообщения:
    13
    sensored
    Надо чтобы код из разных файлов оказывался в одной секции кода точно также и с данными.
     
  4. ProgramMan

    ProgramMan New Member

    Публикаций:
    0
    Регистрация:
    13 янв 2004
    Сообщения:
    263
    в секции кода:
    include 'mod1.inc'
    include 'mod2.inc'
    include 'mod3.inc'
    естественно код внутри mod организован в виде процедур
    так же с данными
     
  5. HumanAPI

    HumanAPI New Member

    Публикаций:
    0
    Регистрация:
    23 июн 2007
    Сообщения:
    13
    Вообще проблем тут две.
    Возможно ли держать данные и код в одном файле 'mod1.inc' ?
    И как избежать конфликтов переменных с одинаковыми именами объявленных в разных файлах?
     
  6. IceStudent

    IceStudent Active Member

    Публикаций:
    0
    Регистрация:
    2 окт 2003
    Сообщения:
    4.300
    Адрес:
    Ukraine
    HumanAPI
    Делай переменные локальными. А по поводу сабжа - используй MS COFF + сторонний линкер, если не стрёмно включать всё в один конмилируемый файл.
     
  7. AsmGuru62

    AsmGuru62 Member

    Публикаций:
    0
    Регистрация:
    12 сен 2002
    Сообщения:
    689
    Адрес:
    Toronto
    В одном файле код и данные держать можно, но не рекомендуется по соображениям оптимизации (см. мануалы от Интел). Такие данные попадают в секцию кода и это имеет посторонние эффекты. Секцию кода надо делать "writeable" и так далее.

    В принципе, можно иметь несколько файлов, отличающихся только расширением. К примеру, пишется некий модуль, назовём его MODULE1. Тогда, появляются следующие файлы:

    MODULE1.INC - структуры, макросы и пр.
    MODULE1.DAT - данные
    MODULE1.ASM - только код

    Ну и далее, включаем всё это в нужные секции. А чтобы не было совпадения имён - использовать префикс модуля в имени глобальной переменной.
     
  8. ProgramMan

    ProgramMan New Member

    Публикаций:
    0
    Регистрация:
    13 янв 2004
    Сообщения:
    263
    Держать данные и код в одном файле можно, в одной секции тоже можно но не рекомендуется.
    использовать разные имена:) можно перфиксы
    Будет ещё конфлик имён секций, а если так же использовать разные имена, то будет большое кол-во секций... тогда имеет смыл держать вообще весь код и данные в одной секции
     
  9. dr_dred

    dr_dred Сергей

    Публикаций:
    0
    Регистрация:
    12 мар 2005
    Сообщения:
    301
    Адрес:
    Russia
    ProgramMan
    Конфликт имен секций? Такого вроде бы и не было никогда. Проверить не могу.
     
  10. HumanAPI

    HumanAPI New Member

    Публикаций:
    0
    Регистрация:
    23 июн 2007
    Сообщения:
    13
    Fasm нормально компилирует подобные программы, но работать они отказываются.

    По поводу кода и данных в одном подключаемом файле есть идея сделать примерно так
    в основном файле

    section '.data' data readable writeable
    include 'mod1.inc'
    section '.code' code readable executable
    include 'mod1.inc'

    в самом файле mod1.inc использовать условное асемблирование

    if ~ld
    данные
    lb:
    else
    код
    endif

    Примерно так, но надо еще подумать почитать справку.
     
  11. IceStudent

    IceStudent Active Member

    Публикаций:
    0
    Регистрация:
    2 окт 2003
    Сообщения:
    4.300
    Адрес:
    Ukraine
    То есть?
     
  12. HumanAPI

    HumanAPI New Member

    Публикаций:
    0
    Регистрация:
    23 июн 2007
    Сообщения:
    13
    IseStudent
    Выскакивает сообщение, что данный файл не является приложением Win32.
     
  13. dr_dred

    dr_dred Сергей

    Публикаций:
    0
    Регистрация:
    12 мар 2005
    Сообщения:
    301
    Адрес:
    Russia
    HumanAPI
    WinXP SP2 все нормально. IMHO, это либо секции некоторые были пусты, либо компилятор бажный.
     
  14. IceStudent

    IceStudent Active Member

    Публикаций:
    0
    Регистрация:
    2 окт 2003
    Сообщения:
    4.300
    Адрес:
    Ukraine
    То есть, это не работает? Какая система, win2k?

    Код (Text):
    1. format PE GUI
    2. entry __start
    3.  
    4. include '%fasminc%\win32a.inc'
    5.  
    6. section '.code' code readable executable
    7.  
    8. ;<< import
    9. data import
    10.     library user32,'user32.dll'
    11.   import user32,MessageBox,'MessageBoxA'
    12. end data
    13. ;>>
    14.  
    15. align 16
    16. __start:
    17.     call    testf
    18.     ret
    19.  
    20. section '.data' data readable writeable
    21.  
    22. ; data
    23. align 32
    24. szCalc      db 'SciCalc',0
    25. szText      db 'Hi there',0
    26.  
    27. section '.code' code readable executable
    28. proc testf
    29.    
    30.     invoke MessageBox,0,szText,szCalc,MB_ICONINFORMATION
    31.     ret
    32. endp
     
  15. HumanAPI

    HumanAPI New Member

    Публикаций:
    0
    Регистрация:
    23 июн 2007
    Сообщения:
    13
    IseStudent
    Подобный код работает нормально.

    Не работает если использовать include 'win32axp.inc'
    и секции объявлять .code .data
     
  16. dead_body

    dead_body wasm.ru

    Публикаций:
    0
    Регистрация:
    3 сен 2004
    Сообщения:
    603
    Адрес:
    Украина;г.Харьков;г.Н.Каховка
    HumanAPI
    .code .data - всего лишь макросы.

    дай пример где не работает.

    По теме: юзайте макросы из фасмлиба. Там есть udata{} idata{} так же можно сделать и к коду по аналогии. И будет вам и разделение данных и кода и всё в одном месте.