Модульное программирование?

Тема в разделе "WASM.BEGINNERS", создана пользователем defaultplayer, 4 июл 2006.

  1. defaultplayer

    defaultplayer New Member

    Публикаций:
    0
    Регистрация:
    18 июн 2006
    Сообщения:
    214
    Допустим есть 2 модуля: main.asm, some.asm, независимых друг от друга, тоесть у каждого есть ….86, .Model flat, stdcall, своя точка входа и т.д. Допустим из модуля main.asm вызывается процедура some_proc proc объявленная в модуле some.asm. Символ some_proc в модуле main.asm описан как extern some_proc: proc, а в модуле some.asm соответственно public some_proc: near. some_proc вызывается по call. После нажатия на кнопку компиляция в среде RadAsm, компилится только main.asm, а во время линкования, идет ругань unresolved external symbol _some_proc. Вопрос звучит следующим образом: 1) Как в радасме сделать так чтоб он передавал в компилятор имена всех асм файлов? 2) Каждый раз при создании новой some_proc процедуры надо создавать, пересоздавать somelib.lib файл, для того чтобы линкер не писал unresolved external symbol _some_proc?
     
  2. defaultplayer

    defaultplayer New Member

    Публикаций:
    0
    Регистрация:
    18 июн 2006
    Сообщения:
    214
    наверное я как-то неправильно объяснил или задал вопрос, объясните пожалуйста как мне откомпилить 2 асм файла в 2 объектных модуля и слинковать это все в 1 исполняемый. спасибо
     
  3. cresta

    cresta Active Member

    Публикаций:
    0
    Регистрация:
    13 июн 2004
    Сообщения:
    2.257
    используй директиву include
     
  4. defaultplayer

    defaultplayer New Member

    Публикаций:
    0
    Регистрация:
    18 июн 2006
    Сообщения:
    214
    так если включать один асм в другой, то какое же это модульное программирование, получится один объектный модуль, или я что-то не так понял
     
  5. nermest

    nermest New Member

    Публикаций:
    0
    Регистрация:
    3 июл 2006
    Сообщения:
    157
    в твоем наборе асм файлов должна быть только одна точка входа
    правильно: extern some_proc:near
     
  6. defaultplayer

    defaultplayer New Member

    Публикаций:
    0
    Регистрация:
    18 июн 2006
    Сообщения:
    214
    с этим ясно спасибо. вопрос в том что в компилятор передается имя только 1-го асм файла, в моем случае main.asm, а не всех asm файлов проекта, и соответственно получается только 1 obj файл main.obj, так вот когда этот один obj файл предается в линкер для компановки, то линкер ничего не знает о some_proc proc, в моем случае. Вопрос скорее надо было задать так, как передать в компилятор имена всех asm файлов проекта, а потом все получившиеся obj файлы в компоновщик. только без директивы include, иначе если включать один asm файл в другой, то получается один объектный модуль.
     
  7. IceStudent

    IceStudent Active Member

    Публикаций:
    0
    Регистрация:
    2 окт 2003
    Сообщения:
    4.300
    Адрес:
    Ukraine
    defaultplayer
    Задаёшь в `Main program files` имена твоих дополнительных модулей (*.asm и *obj), в `Project options` в командную строку масма добавляешь цифры, соответствующие этим asm файлам: 3,O,$B\ml6 /nologo /c /Cp /coff /Zi /Zd /I"$I",2,18
    то же самое и для линкера (только уже указываешь obj).
     
  8. defaultplayer

    defaultplayer New Member

    Публикаций:
    0
    Регистрация:
    18 июн 2006
    Сообщения:
    214
    спасибо
     
  9. Quantum

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

    Публикаций:
    0
    Регистрация:
    6 янв 2003
    Сообщения:
    3.143
    Адрес:
    Ukraine
    2 nermest:
    Это для тасма нужно NEAR указывать, а в масме можно хоть DWORD.
     
  10. defaultplayer

    defaultplayer New Member

    Публикаций:
    0
    Регистрация:
    18 июн 2006
    Сообщения:
    214
    Тема снова актуальна , вопрос такого плана : есть 3 модуля, main.asm, 2.asm, 3.asm, каждый из них имеет n-ое кол-во процедур; в каждом есть вызовы процедур из двух соседних модулей, вызовы по invoke, поэтому лепим к каждому из асм файлов соответствующий инк файл, с теми же именами (для удобства), - main.inc, 2.inc, 3.inc, в которых описываем прототипы процедур. напомню, модули компилятся отдельно. теперь значит для нормального прохождения компиляции достаточно включить соответствующий инк файл с описанным прототипом. кстати для внешнего использования процедур не нужно почему-то описывать их имена таким образом extern some_proc:near, public some_proc: near соответственно (этот вопрос для меня пока тоже остается открытым). как выяснили для переменных это делать нужно, но вот в чем проблема, к примеру в файле 2.asm и 3.asm объявлено по переменной 2asm_var и 3asm_var соответственно и там же описаны как public 2asm_var:dword и public 3asm_var:dword, обе переменные используются из main.asm, и предположим что объявленная переменная в файле 2.asm, 2asm_var, также используется из модуля 3.asm, далее для нормальной компиляции main.asm в файле main.inc мы описываем символы этих переменных как extern 2asm_var:dword и extern 3asm_var:dword , как было сказано выше 2asm_var, также используется из модуля 3.asm, поэтому якобы воизбежание повторного описания переменной 2asm_var как внешнеиспользуемую, main.inc включаем и в 3.asm, НО, в main.inc также описана и переменная 3asm_var, что приводит к ошибке «переопределение символа», тоесть столкнулся с проблемой, либо ошибка, либо повторно нужно описывать в другом файле переменную 3asm_var как внешнеиспользуемую, что не есть, правильным модульным программированием. подскажите как выйти из ситуации.
     
  11. Quantum

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

    Публикаций:
    0
    Регистрация:
    6 янв 2003
    Сообщения:
    3.143
    Адрес:
    Ukraine
    defaultplayer
    Или 1 инклуд со всеми прототипами.

    Директива PROC автоматически создаёт публичный символ согласно заданному соглашению.

    Использовать EXTERNDEF вместо EXTERN.
     
  12. defaultplayer

    defaultplayer New Member

    Публикаций:
    0
    Регистрация:
    18 июн 2006
    Сообщения:
    214
    спасибо, а в чем разница между директивами
     
  13. Quantum

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

    Публикаций:
    0
    Регистрация:
    6 янв 2003
    Сообщения:
    3.143
    Адрес:
    Ukraine
    EXTERNDEF игнорируется компилятором, если символ с таким именем уже присутсвует в текущем модуле. См. документацию.
     
  14. defaultplayer

    defaultplayer New Member

    Публикаций:
    0
    Регистрация:
    18 июн 2006
    Сообщения:
    214
    игнорируется, но все таки становится внешнедоступным?
     
  15. defaultplayer

    defaultplayer New Member

    Публикаций:
    0
    Регистрация:
    18 июн 2006
    Сообщения:
    214
    точнее внешнеразрешенным
     
  16. defaultplayer

    defaultplayer New Member

    Публикаций:
    0
    Регистрация:
    18 июн 2006
    Сообщения:
    214
    а тю, все понял, чепуху намолол, спасибо
     
  17. IceStudent

    IceStudent Active Member

    Публикаций:
    0
    Регистрация:
    2 окт 2003
    Сообщения:
    4.300
    Адрес:
    Ukraine
    EXTERNDEF разворачивается в PUBLIC, если переменная объявлена в текущем модуле, и в EXTERN, в противном.
     
  18. defaultplayer

    defaultplayer New Member

    Публикаций:
    0
    Регистрация:
    18 июн 2006
    Сообщения:
    214
    ценное объяснение, а каков смысл в использовании PUBLIC, EXTERN, если есть EXTERNDEF
     
  19. Quantum

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

    Публикаций:
    0
    Регистрация:
    6 янв 2003
    Сообщения:
    3.143
    Адрес:
    Ukraine
    defaultplayer
    Через EXTERN можно задать альтернативный символ для линкера, если основной не найден, а через EXTERNDEF - нельзя.
     
  20. defaultplayer

    defaultplayer New Member

    Публикаций:
    0
    Регистрация:
    18 июн 2006
    Сообщения:
    214
    а можно пример