Как разделить один *.asm на 2 части

Тема в разделе "WASM.BEGINNERS", создана пользователем Vitaliy_, 28 июл 2008.

  1. Vitaliy_

    Vitaliy_ New Member

    Публикаций:
    0
    Регистрация:
    28 июл 2008
    Сообщения:
    2
    Приведу пример до боли всем знакомый:
    .386
    .model flat,stdcall
    option casemap:none
    include \masm32\include\windows.inc
    include \masm32\include\kernel32.inc
    includelib \masm32\lib\kernel32.lib
    include \masm32\include\user32.inc
    includelib \masm32\lib\user32.lib
    .data
    MsgBoxCaption db "Iczelion Tutorial No.2",0
    MsgBoxText db "Win32 Assembly is Great!",0
    .code
    start:
    invoke MessageBox, NULL, addr MsgBoxText, addr MsgBoxCaption, MB_OK
    invoke ExitProcess, NULL
    end start
    ---------------------------------------------------
    теперь делим на 2 части:
    ;file_1.asm
    .386
    .model flat,stdcall
    option casemap:none
    include \masm32\include\windows.inc
    include \masm32\include\kernel32.inc
    includelib \masm32\lib\kernel32.lib
    include \masm32\include\user32.inc
    includelib \masm32\lib\user32.lib
    include File_2.asm
    .data
    MsgBoxCaption db "Iczelion Tutorial No.2",0
    MsgBoxText db "Win32 Assembly is Great!",0
    .code
    start:
    Proc1
    end start
    ----------------------------------------------
    ;File_2.asm
    .code
    Proc1:
    invoke MessageBox, NULL, addr MsgBoxText, addr MsgBoxCaption, MB_OK
    invoke ExitProcess, NULL
    end Proc1
    ------------------------------------------------
    После компиляции выходит сообщение error MsgBoxText и MsgBoxCaption,
    я так понимаю ошибка сообщает что эти данные не инициализированы.
    Вопрос как это сделать, что бы данные (глобальные) были "видны" везде. И не только данные но и метки?
    Заранее спасибо.
     
  2. litrovith

    litrovith Member

    Публикаций:
    0
    Регистрация:
    20 июн 2007
    Сообщения:
    509
    Код (Text):
    1. ;file_1.asm
    2. .386
    3. .model flat,stdcall
    4. option casemap:none
    5. include \masm32\include\windows.inc
    6. include \masm32\include\kernel32.inc
    7. includelib \masm32\lib\kernel32.lib
    8. include \masm32\include\user32.inc
    9. includelib \masm32\lib\user32.lib
    10. .data
    11. MsgBoxCaption  db "Iczelion Tutorial No.2",0
    12. MsgBoxText     db "Win32 Assembly is Great!",0
    13. .code
    14. start:
    15. include File_2.asm
    16. end start
    17.  
    18. ;File_2.asm
    19. .code
    20. Proc1:
    21.        invoke MessageBox, NULL, addr MsgBoxText, addr MsgBoxCaption, MB_OK
    22.        invoke ExitProcess, NULL
    23. end Proc1
     
  3. Vitaliy_

    Vitaliy_ New Member

    Публикаций:
    0
    Регистрация:
    28 июл 2008
    Сообщения:
    2
    Изумительно, как логически было просто, litrovith спасибо Вам огромное!!!
     
  4. litrovith

    litrovith Member

    Публикаций:
    0
    Регистрация:
    20 июн 2007
    Сообщения:
    509
    Vitaliy_, за спасибо еще вариант:
    Код (Text):
    1. ;file_1.asm
    2. .386
    3. .model flat,stdcall
    4. option casemap:none
    5. include \masm32\include\windows.inc
    6. include \masm32\include\kernel32.inc
    7. includelib \masm32\lib\kernel32.lib
    8. include \masm32\include\user32.inc
    9. includelib \masm32\lib\user32.lib
    10. .data
    11. MsgBoxCaption  db "Iczelion Tutorial No.2",0
    12. MsgBoxText     db "Win32 Assembly is Great!",0
    13. include File_2.asm
    14. .code
    15. start:
    16. Proc1
    17. Proc1
    18. end start
    19.  
    20. ;File_2.asm
    21. Proc1 macro
    22.        invoke MessageBox, NULL, addr MsgBoxText, addr MsgBoxCaption, MB_OK
    23.        invoke ExitProcess, NULL
    24.  endm
     
  5. Vilco

    Vilco Vitaly

    Публикаций:
    0
    Регистрация:
    5 мар 2007
    Сообщения:
    190
    Адрес:
    Nsk, Russia
    Чтобы использовать переменную в другом модуле, её определяют как PUBLIC; в модуле где предполагается её применять, пишут EXTERN (см документацию к masm)
     
  6. Barbos

    Barbos Slavon

    Публикаций:
    0
    Регистрация:
    13 ноя 2007
    Сообщения:
    280
    Адрес:
    Kharkov
    А я даже не объявляю паликов и экстернов.
    Пишу заголовочный файл с прототипами (PROTO) функций, которые хочу сделать извне доступными. В тексте, в котором собираюсь их использовать - include <имя_загаловочного>. Прокатывает и нет необходимости отслеживать public-extern - все собрано в одном месте.
     
  7. Vilco

    Vilco Vitaly

    Публикаций:
    0
    Регистрация:
    5 мар 2007
    Сообщения:
    190
    Адрес:
    Nsk, Russia
    Это не совсем правильно, всякие си-компиляторы варнят за это. Что например, если я захочу обращаться к этой переменной не из 1, а из 2 модулей?
     
  8. driver

    driver New Member

    Публикаций:
    0
    Регистрация:
    18 июн 2008
    Сообщения:
    302
    у меня получается - переменная, которая используется в модуле, должна быть в нём и обьвлена,не помню - становится она "тотально глобальной" или нет.
    щас даже програмку в несколько тысяч строк стараюсь делать в одном модуле - если нет готовых отлаженных модулей, попроще работать, правая рука болит немного, но это мелочи...