Здравствуйте уважаемые знатоки. Проблема собственно вот в чем. Начал изучать туторы Iczelion'a и паралельно решил почитать какой-нибудь учебник. Под руку попал Пирогов "Ассемблер для Windows". И сравнивая тексты программ и пытаясь их повторить я застопорился на одном месте. Дело в том, что Iczelion определяет структуры директивой Local в процедуре WinMain. А вот господин Пирогов определяет их в секции Data. Причем эта секция у него начинается почему-то со строки: _DATA SEGMENT DWORD PUBLIC USE32 'DATA' когда у Iczelion'a просто .DATA. Ну так вот. Пирогов плюс ко всему еще инициализацию структуры проводит в самом файле программы, т.е. инклудами он старается не пользоваться. Я же решил в его программе попробовать приинклудить windows.inc закоментировав соответственно кусок кода с инициализацией структур в проге. При компиляции у меня выскакивает целая куча вот таких вот ошибок: \masm32\include\windows.inc<129>:error A2004: symbol type conflict: bool \masm32\include\windows.inc<7804>:error A2179: structure improperly initialize d \masm32\include\windows.inc<7804>:error A2008: syntax error: in structure \masm32\include\windows.inc<8711>:error A2179: structure improperly initialize Вот кусок проги: .386 .model flat, stdcall include \masm32\include\windows.inc include \masm32\include\user32.inc includelib \masm32\lib\user32.lib include \masm32\include\kernel32.inc includelib \masm32\lib\kernel32.lib style equ CS_HREDRAW+CS_VREDRAW+CS_GLOBALCLASS _DATA SEGMENT DWORD PUBLIC USE32 'DATA' NEWHWND DD 0 MSG MSGSTRUCT <?> WC WNDCLASS <?> HINST DD 0 TITLENAME DB 'Пример - кнопка выхода',0 CLASSNAME DB 'CLASS 32',0 CPBUT DB 'Выход',0 CLSBUTN DB 'BUTTON',0 HWNDBTN DWORD 0 CAP DB 'Сообщение',0 MES DB 'Конец работы программы',0 _DATA ENDS _TEXT SEGMENT DWORD PUBLIC USE32 'CODE' START: PUSH 0 CALL GetModuleHandle Mov [HINST],Eax ;--------Заполняем структуру окна Mov WC.style,CS_HREDRAW OR CS_VREDRAW OR CS_GLOBALCLASS MOV WC.lpfnWndProc,OFFSET WNDPROC MOV WC.cbClsExtra,0 MOV WC.cbWndExtra,0 MOV EAX,[HINST] MOV WC.hInstance,EAX ;--------Иконка окна PUSH IDI_APPLICATION PUSH 0 CALL LOADICON MOV WC.hIcon,EAX ;--------Курсор окна PUSH IDC_CROSS PUSH 0 CALL LOADCURSOR MOV WC.hCursor,EAX MOV WC.hbrBackground,17 MOV DWORD PTR WC.lpszMenuName,0 MOV DWORD PTR WC.lpszClassName,OFFSET CLASSNAME PUSH OFFSET WC Синтактических ошибок вроде нет, сравнивал с windows.inc. В чем я ошибаюсь?
Зависит от инструмента, которым ты пользуешься. Щас посмотрел Пирогова, по-моему, это директива (определение секции, а у него "сегмент данных") Код (Text): _DATA SEGMENT DWORD PUBLIC USE32 'DATA' _DATA ENDS для TASM. Чуть выше там написано "Теперь, чтобы добиться транслируемости программы на Турбо Ассемблере, нужно проделать те же манипуляции, которые мы производили раньше: убрать суффиксы @N и подключить библиотеку import32.lib." ...Iczelion даёт свои примеры для компилятора MASM. Если использовать этот компилятор и исходник, написанный для TASM, ничё хорошего не выйдет. Извините, если ошибаюсь
Да нет, у Пирогова и для MASM и для TASM эта секция обозначается одинаково. Тем более, что я уже пробывал обозначать ее как у Iczelion'a просто .DATA и .CODE. Ситуация не изменилась.
может стОит поместить неинициализируемые данные Код (Text): MSG MSGSTRUCT <?> WC WNDCLASS <?> в соответствующую секцию? ни о чём не говорит?
Так я не понял, ты чем пользуешься? MASM? Если MASM, тогда я внёс в твой код два таких изменения и всё стало более или менее понятно 1) Код (Text): .386 .model flat, stdcall option casemap:none Написал третью строчку. Зачем она нужна, не знаю, но Iczelion пишет,что она обязательна в высшей степени. Здесь. http://www.wasm.ru/article.php?article=1001003 2) Далее, в конец проги написа так: Код (Text): end START Псле этого осталось 2 ошибки, с ними уже легче разобраться. Такие: Код (Text): undefined simvol: LOADICON undefined simvol: LOADCURSOR Мне понятно, что к чему. Нигде в тексте проги не упоминаются метки LOADICON и LOADCURSOR Вот компилятор и удивляется- как же можно прыгнуть на адрес, который неизвестен? CALL LOADCURSOR и CALL LOADINOC И обозначает эти самые прыжки. ...А определи ты где-нибудь в тексте проги (в секции кода!) эти метки вот так: Код (Text): LOADCURSOR: LOADICON: (хоть в самом конце) И он ругаться перестанет. Где ИМЕННО определить эти самые метки- вопрос архиважный. За сим я удаляюсь.
Xenobius Код (Text): option casemap:none это и есть корень проблемы вставляете эту строчку в начало и далее пишете в своем коде все внешние имена также как они опубликованы с учетом регистра
если ее нет то регистр не учитывается и windows.inc написанный в стиле учета регистра букв работать не будет
Спасибо всем за отзывчивость. Как выяснилось и правда строчка option casemap:none оказалась виновата. Я честно говоря намерянно ее не вставил в текст программы. Решил поэксперементировать что будет если не учитывать регистр символов. Но ошибки типа "structure improperly initialize" меня честно говоря сбили с толку. Никак не думал, что это из-за регистра. И еще несколько моментов оказались для меня неожиданными. Хоть я и переместил неинициализированные данные в соотвествующую секцию компилятор мне так и выдавал ошибку "structure improperly initialize" на строку кода: Код (Text): MSG MSG <?> пока я ее не изменил на msg MSG <?>. Уж здесь-то регистр точно должен быть не причем. Ведь без разницы как я назову инициализируемую структурой переменную. И еще. Строка завершающая процедуру окна WNDPROC endp. Компилятор мне заявлял, что в этой строке Syntax error : endp. Пока я не изменил назввание процедуры на WndProc он так и писал эту ошибку. Я и не знал, что здесь тоже важен регистр. Сколько нового узнал! Еще раз спасибо. Не на каждом форуме такая быстрая реакция коллектива.