Проблема с определением структур в программе

Тема в разделе "WASM.BEGINNERS", создана пользователем Xenobius, 28 ноя 2009.

  1. Xenobius

    Xenobius New Member

    Публикаций:
    0
    Регистрация:
    14 окт 2009
    Сообщения:
    5
    Здравствуйте уважаемые знатоки. Проблема собственно вот в чем. Начал изучать
    туторы 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. В чем я ошибаюсь?
     
  2. amvoz

    amvoz Member

    Публикаций:
    0
    Регистрация:
    12 ноя 2008
    Сообщения:
    653
    Зависит от инструмента, которым ты пользуешься. Щас посмотрел Пирогова, по-моему, это директива (определение секции, а у него "сегмент данных")
    Код (Text):
    1. _DATA SEGMENT DWORD PUBLIC USE32 'DATA'
    2. _DATA ENDS
    для TASM. Чуть выше там написано

    "Теперь, чтобы добиться транслируемости программы на Турбо Ассемблере, нужно проделать те же манипуляции, которые мы производили раньше: убрать суффиксы @N и подключить библиотеку import32.lib."

    ...Iczelion даёт свои примеры для компилятора MASM. Если использовать этот компилятор и исходник, написанный для TASM, ничё хорошего не выйдет. Извините, если ошибаюсь
     
  3. Xenobius

    Xenobius New Member

    Публикаций:
    0
    Регистрация:
    14 окт 2009
    Сообщения:
    5
    Да нет, у Пирогова и для MASM и для TASM эта секция обозначается одинаково.
    Тем более, что я уже пробывал обозначать ее как у Iczelion'a просто .DATA и .CODE.
    Ситуация не изменилась.
     
  4. RamMerLabs

    RamMerLabs Well-Known Member

    Публикаций:
    0
    Регистрация:
    11 сен 2006
    Сообщения:
    1.426
    может стОит поместить неинициализируемые данные
    Код (Text):
    1.    MSG   MSGSTRUCT <?>
    2.    WC  WNDCLASS <?>
    в соответствующую секцию?
    ни о чём не говорит?
     
  5. amvoz

    amvoz Member

    Публикаций:
    0
    Регистрация:
    12 ноя 2008
    Сообщения:
    653
    Так я не понял, ты чем пользуешься? MASM?
    Если MASM, тогда я внёс в твой код два таких изменения и всё стало более или менее понятно

    1)
    Код (Text):
    1. .386
    2. .model flat, stdcall
    3. option casemap:none
    Написал третью строчку. Зачем она нужна, не знаю, но Iczelion пишет,что она обязательна в высшей степени. Здесь.
    http://www.wasm.ru/article.php?article=1001003

    2) Далее, в конец проги написа так:
    Код (Text):
    1. end START
    Псле этого осталось 2 ошибки, с ними уже легче разобраться. Такие:
    Код (Text):
    1. undefined simvol: LOADICON
    2. undefined simvol: LOADCURSOR
    Мне понятно, что к чему. Нигде в тексте проги не упоминаются метки LOADICON и LOADCURSOR
    Вот компилятор и удивляется- как же можно прыгнуть на адрес, который неизвестен?
    CALL LOADCURSOR и CALL LOADINOC
    И обозначает эти самые прыжки.

    ...А определи ты где-нибудь в тексте проги (в секции кода!) эти метки вот так:
    Код (Text):
    1.      LOADCURSOR:
    2.      LOADICON:
    (хоть в самом конце)
    И он ругаться перестанет.

    Где ИМЕННО определить эти самые метки- вопрос архиважный. За сим я удаляюсь.
     
  6. amvoz

    amvoz Member

    Публикаций:
    0
    Регистрация:
    12 ноя 2008
    Сообщения:
    653
    Да, прошу прощения и с
    Код (Text):
    1. MSG   MSGSTRUCT <?>
    2.    WC  WNDCLASS <?>
    разобраться, конечно
     
  7. RamMerLabs

    RamMerLabs Well-Known Member

    Публикаций:
    0
    Регистрация:
    11 сен 2006
    Сообщения:
    1.426
    наверное потому, что это API, только зачем-то написанные полностью в верхнем регистре.
     
  8. Rockphorr

    Rockphorr Well-Known Member

    Публикаций:
    0
    Регистрация:
    9 июн 2004
    Сообщения:
    2.625
    Адрес:
    Russia
    Xenobius

    Код (Text):
    1. option casemap:none
    это и есть корень проблемы

    вставляете эту строчку в начало и далее пишете в своем коде все внешние имена также как они опубликованы с учетом регистра
     
  9. Rockphorr

    Rockphorr Well-Known Member

    Публикаций:
    0
    Регистрация:
    9 июн 2004
    Сообщения:
    2.625
    Адрес:
    Russia
    если ее нет то регистр не учитывается и windows.inc написанный в стиле учета регистра букв работать не будет
     
  10. Xenobius

    Xenobius New Member

    Публикаций:
    0
    Регистрация:
    14 окт 2009
    Сообщения:
    5
    Спасибо всем за отзывчивость. Как выяснилось и правда строчка option casemap:none оказалась виновата. Я честно говоря намерянно ее не вставил в текст программы. Решил поэксперементировать что будет если не учитывать регистр символов. Но ошибки типа "structure improperly initialize" меня честно говоря сбили с толку. Никак не думал, что это из-за регистра.
    И еще несколько моментов оказались для меня неожиданными. Хоть я и переместил неинициализированные данные в соотвествующую секцию компилятор мне так и выдавал ошибку "structure improperly initialize" на строку кода:
    Код (Text):
    1. MSG MSG <?>
    пока я ее не изменил на msg MSG <?>. Уж здесь-то регистр точно должен быть не причем. Ведь без разницы как я назову инициализируемую структурой переменную.
    И еще. Строка завершающая процедуру окна WNDPROC endp. Компилятор мне заявлял,
    что в этой строке Syntax error : endp. Пока я не изменил назввание процедуры на WndProc он так и писал эту ошибку. Я и не знал, что здесь тоже важен регистр.
    Сколько нового узнал! Еще раз спасибо. Не на каждом форуме такая быстрая реакция коллектива.