Приведу пример до боли всем знакомый: .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, я так понимаю ошибка сообщает что эти данные не инициализированы. Вопрос как это сделать, что бы данные (глобальные) были "видны" везде. И не только данные но и метки? Заранее спасибо.
Код (Text): ;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 .data MsgBoxCaption db "Iczelion Tutorial No.2",0 MsgBoxText db "Win32 Assembly is Great!",0 .code start: include File_2.asm end start ;File_2.asm .code Proc1: invoke MessageBox, NULL, addr MsgBoxText, addr MsgBoxCaption, MB_OK invoke ExitProcess, NULL end Proc1
Vitaliy_, за спасибо еще вариант: Код (Text): ;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 .data MsgBoxCaption db "Iczelion Tutorial No.2",0 MsgBoxText db "Win32 Assembly is Great!",0 include File_2.asm .code start: Proc1 Proc1 end start ;File_2.asm Proc1 macro invoke MessageBox, NULL, addr MsgBoxText, addr MsgBoxCaption, MB_OK invoke ExitProcess, NULL endm
Чтобы использовать переменную в другом модуле, её определяют как PUBLIC; в модуле где предполагается её применять, пишут EXTERN (см документацию к masm)
А я даже не объявляю паликов и экстернов. Пишу заголовочный файл с прототипами (PROTO) функций, которые хочу сделать извне доступными. В тексте, в котором собираюсь их использовать - include <имя_загаловочного>. Прокатывает и нет необходимости отслеживать public-extern - все собрано в одном месте.
Это не совсем правильно, всякие си-компиляторы варнят за это. Что например, если я захочу обращаться к этой переменной не из 1, а из 2 модулей?
у меня получается - переменная, которая используется в модуле, должна быть в нём и обьвлена,не помню - становится она "тотально глобальной" или нет. щас даже програмку в несколько тысяч строк стараюсь делать в одном модуле - если нет готовых отлаженных модулей, попроще работать, правая рука болит немного, но это мелочи...