Помогите найти ошибки в примере

Тема в разделе "WASM.BEGINNERS", создана пользователем 123dragon, 24 фев 2006.

Статус темы:
Закрыта.
  1. 123dragon

    123dragon New Member

    Публикаций:
    0
    Регистрация:
    12 янв 2005
    Сообщения:
    46
    Адрес:
    Russia
    Купил книгу "Ассемблер для Windows" 3-е издание Пирагова, стал набирать пример, возникли ошибки, нашел отпечатки - исправил - все равно возникли ошибки, автор на письмо не отвечает. Если кому не лень скажите что здесь не то.
    Код (Text):
    1. .586
    2. ;плоская модель памяти
    3. .MODEL FLAT, stdcall
    4. ;константы
    5. ;сообщение приходит при закрытии окна
    6. WM_DESTROY EQU 2
    7. ;сообщение приходит при закрытии окна
    8. WM_CREATE EQU 1
    9. ;сообщение при щелчке левой кнопкой мыши в области окна
    10. WM_LBUTTONDOWN EQU 201h
    11. ;сообщение при щелчке правой кнопкой мыши в области окна
    12. WM_RBUTTONDOWN EQU 204h
    13. ;свойство окна
    14. CS_VREDRAW EQU 1h
    15. CS_HREDRAW EQU 2h
    16. CS_GLOBALCLASS EQU 4000h
    17. WS_OVERLAPPEDWINDOW EQU 00CF0000H
    18. style equ CS_HREDRAW+CS_VREFRAW+CS_GLOBALCLASS
    19. ;индификатор стандатрной пинтограммы
    20. IDI_APPLICATION EQU 32512
    21. ;индитификатор курсора
    22. IDC_CROSS EQU 32512
    23. ;режим показа нормальный
    24. SW_SHOWN9RMAL equ 1
    25. ;прототипы внешних процедур
    26. EXTERN MessageBox@16:NEAR
    27. EXTERN CreateWindowExA@48:NEAR
    28. EXTERN DefWindowProcA@16:NEAR
    29. EXTERN DispathMessageA@4:NEAR
    30. EXTERN ExitProcess@4:NEAR
    31. EXTERN GetMessageA@16:NEAR
    32. EXTERN GetModuleHandleA@4:NEAR
    33. EXTERN LoadCursorA@8:NEAR
    34. EXTERN LoadIconA@8:NEAR
    35. EXTERN PostQuitMessage@4:NEAR
    36. EXTERN RegisterClassA@4:NEAR
    37. EXTERN ShowWindow@8:NEAR
    38. EXTERN TranslateMessage@4:NEAR
    39. EXTERN UpdateWindow@4:NEAR
    40.  
    41. ;директивы компоновщику для подключения библиотек
    42. includelib c:\masm32\lib\user32.lib
    43. includelib c:\masm32\lib\kernel32.lib
    44.  
    45. ;------------------------------------------------
    46. ;структуры
    47. ;структура сообщения
    48. MSGSTRUCT STRUC
    49.     MSHWND  DD ?    ;ИНДЕНТИФИКАТОР ОКНА, ПОЛУЧАЮЩЕГО СООБЩЕНИЯ
    50.     MSMESSAGE   DD ?    ;ИНДЕНТИФИКАТОР СООБЩЕНИЯ
    51.     MSWPARAM    DD ?    ;ДОП. ИНФОРМАЦИЯ О СООБЩЕНИИ
    52.     MSLPARAM    DD ?    ;ДОП. ИНФОРМАЦИЯ О СООБЩЕНИИ
    53.     MSTIME      DD ?    ;ВРЕМЯ ПОСЫЛКИ СООБЩЕНИЯ
    54.     MSPT        DD ?    ;ПОЛОЖЕНИЕ КУРСОРА ВО ВРЕМЯ ПОСЫЛКИ СООБЩЕНИЯ
    55. MSGSTRUCT ends
    56.  
    57. WNDCLASS STRUC
    58. CLSSTYLE    DD ?    ;стиль окна
    59. CLWNDPROC   DD ?    ;указатель на процедуру окна
    60. CLSCEXTRA   DD ?    ;информация о дополнительных байтах для окна
    61. CLSWNDEXTRA DD ?    ;информация о доп. байтах для окна
    62. CLSHINSTANCE DD ?   ;дескриптор приложения
    63. CLSHICON    DD ?    ;индентификатор пиктограммы окна
    64. CLSHCURSO   DD ?    ;индентификатор курсора
    65. CLBKGROUND  DD ?    ;индентификатор кисти окна
    66. CLMENUNAME  DD ?    ;имя-индефикатор меню
    67. CLNAME      DD ?    ;специфицирует имя класса окна
    68. WNDCLASS ends
    69.  
    70. ;сегмент данных
    71. _DATA SEGMENT
    72. NEWHWN  DD 0
    73. MSG     MSGSTRUCT <?>
    74. WC      WNDCLASS <?>
    75. HINST   DD 0    ;здесь хранится дескриптор приложения
    76. TITLENAME   DB 'ПРОСТОЙ ПРИМЕР 32-БИТНОГО ПРИЛОЖЕНИЯ',0
    77. CLASSNAME   DB 'CLASS32',0
    78. CAP         DB 'Сообщение',0
    79. MES1        DB 'Вы нажали левую кнопку мыши',0
    80. MES2        DB 'Выход из программы, Пока!',0
    81. _DATA ENDS
    82.  
    83. ;СЕГМЕНТ КОДА
    84. _TEXT SEGMENT
    85. START:
    86. ;получить дискриптор приложения
    87. push 0
    88. call GetModuleHandleA@4
    89. mov [HINST],eax
    90.  
    91. REG_CLASS:
    92.     ;заполнить структуру окна
    93.     ;стиль
    94.     mov [WC.CLSSTYLE],style
    95.    
    96.     ;процедура обработки сообщения
    97.         mov [WC.CLWNDPROC], offset WNDPROC
    98.         mov [WC.CLSCEXTRA],0
    99.         mov [WC.WNDEXTRA],0
    100.         mov eax, [HINST]
    101.         mov [WC.CLSHINSTANCE],eax
    102.     ;пинтограмма окна
    103.         push IDI_APPLICATION
    104.         push 0
    105.         call LoadIconA@8
    106.         mov [WC.CLSHICON],eax
    107.     ;курсор окна
    108.         push IDC_CROSS
    109.         push 0
    110.         call LoadCursorA@8
    111.         mov [WC.CLSHCURSOR],eax
    112.     ;--------------------------
    113.         mov [WC.CLBKGROUND],17      ;цвет окна
    114.         mov DWORD PTR [WC.CLMENUNAME],0
    115.         mov DWORD PTR [WC.CLNAME], OFFSET CLASSNAME
    116.         push OFFSET WC
    117.         call RegisterClassA@4
    118.     ;создать окно зарегистрированного класса
    119.         push 0
    120.         push [HINST]
    121.         push 0
    122.         push 0
    123.         push 400        ;DY - высота окна
    124.         push 400        ;DX - ширина окна
    125.         push 100        ;Y -коорд. левого верхнего угла
    126.         push 100        ;X -коорд. левого верхнего угла
    127.         push WS_OVERLAPPEDWINDOW
    128.         push OFFSET TITLENAME       ;имя окна
    129.         push OFFSET CLASSNAME       ;имя класса
    130.         push 0
    131.         call CreateWindowExA@48
    132.     ;проверка на ошибку
    133.         cmp eax,0
    134.         jz _ERR
    135.         mov [NEWHWND], eax      ;дескриптор окна
    136.     ;----------------------------
    137.         push SW_SHOWNORMAL
    138.         push [NEWHWND]
    139.         call ShowWindow@8       ;показать созданное окно
    140.     ;----------------------------
    141.         push [NEWHWND]
    142.         call UpdateWindow@4     ;комманда перерисовать видимую часть окна, сообщение WM_PAINT
    143.    
    144.     ;цикл обработки сообщений
    145.     MSG_LOOP:
    146.         PUSH 0
    147.         PUSH 0
    148.         PUSH 0
    149.         PUSH OFFSET MSG
    150.         CALL GetMessageA@16
    151.         CMP EAX,0
    152.         JE END_LOOP
    153.         PUSH OFFSET MSG
    154.         CALL TranslateMessage@4
    155.         PUSH OFFSET MSG
    156.         CALL DispatchMessageA@4
    157.         JMP MSG_LOOP
    158.    
    159.     END_LOOP:
    160.         JMP END_LOOP
    161.     ;------------------------------
    162.     ;ПРОЦЕДУРА ОКНА
    163.     ;расположение параметров в стеке
    164.     ;[EBP+014H] LPARAM
    165.     ;[EBP+10H] WAPARAM
    166.     ;[EBP+OCH] MES
    167.     ;[EBP+8] HWND
    168.    
    169. WNDPROC PROC
    170.     PUSH EBP
    171.     MOV EBP,ESP
    172.     PUSH EBX
    173.     PUSH ESI
    174.     PUSH ESI
    175.     PUSH EDI
    176.     CMP DWORD PTR [EBP+0CH],WM_DESTROY
    177.     JE WMDESTROY
    178.     CMP DWORD PTR [EBP+0CH],WM_CREATE
    179.     JE WMCREATE
    180.     CMP DWORD PTR [EBP+0CH],WM_LBUTTONDOWN      ;левая кнопка мыши
    181.     JE LBUTTON
    182.     CMP DWORD PTR [EBP+0CH],WM_RBUTTONDOWN      ;правая кнопка мыши
    183.     JE RBUTTON
    184.     JMP DEFWNDPROC
    185.    
    186.     ;нажатие правой кнопки приводит к закрытию окна
    187.     RBUTTON:
    188.         JMP WMDESTROY
    189.    
    190.     ;нажатие левой кнопки мышы
    191.     LBUTTON:
    192.     ;выводим сообщение
    193.         PUSH 0      ;MB_OK
    194.         PUSH OFFSET CAP
    195.         PUSH OFFSET MES1
    196.         PUSH DWORD PTR [EBP+08H]
    197.         CALL MessageBoxA@16
    198.         MOV EAX,0
    199.         JMP FINISH
    200.        
    201.     WMCREATE:
    202.         MOV EAX,0
    203.         JMP FINISH
    204.        
    205.     DEFWNDPROC:
    206.         PUSH DWORD PTR [EBP+14H]
    207.         PUSH DWORD PTR [EBP+10H]
    208.         PUSH DWORD PTR [EBP+0CH]
    209.         PUSH DWORD PTR [EBP+08H]
    210.         CALL DefWindowProcA@16
    211.         JMP FINISH
    212.        
    213.     WMDESTROY:
    214.         PUSH 0      ;MB_OK
    215.         PUSH OFFSET CAP
    216.         PUSH OFFSET MES2
    217.         PUSH DWORD PTR [EBP+08H]    ;декриптор окна
    218.         CALL MessageBoxA@16
    219.         PUSH 0
    220.         CALL PostQuitMessage@4      ;сообщение WM_QUIT
    221.         MOV EAX,0
    222.    
    223.     FINISH:
    224.         POP EDI
    225.         POP ESI
    226.         POP EBX
    227.         POP EBP
    228.         ret 16
    229.  
    230. WNDPROC endp
    231. _TEXT ENDS
    232. END START
    233.  
     
  2. OlegA11

    OlegA11 New Member

    Публикаций:
    0
    Регистрация:
    12 фев 2006
    Сообщения:
    102
    Ошибки нужно искать самому.

    Или ты никогда ничему не научишся. Никто не хочет делать за других, их работу.

    Учи ассемблер, разберайся, что к чему, а ошибка сама найдётся.

    Ещё:

    Если уж просишь, найти ошибку, опиши её.
     
  3. 123dragon

    123dragon New Member

    Публикаций:
    0
    Регистрация:
    12 янв 2005
    Сообщения:
    46
    Адрес:
    Russia
    Описание ошибок:

    1.2.2.asm(94) : error A2006: undefined symbol : CS_VREFRAW

    1.2.2.asm(99) : error A2006: undefined symbol : WNDEXTRA

    1.2.2.asm(111) : error A2006: undefined symbol : CLSHCURSOR

    1.2.2.asm(134) : error A2006: undefined symbol : _ERR - нашел

    1.2.2.asm(135) : error A2006: undefined symbol : NEWHWND

    1.2.2.asm(137) : error A2006: undefined symbol : SW_SHOWNORMAL

    1.2.2.asm(138) : error A2006: undefined symbol : NEWHWND

    1.2.2.asm(141) : error A2006: undefined symbol : NEWHWND

    1.2.2.asm(156) : error A2006: undefined symbol : DispatchMessageA@4

    1.2.2.asm(197) : error A2006: undefined symbol : MessageBoxA@16

    1.2.2.asm(218) : error A2006: undefined symbol : MessageBoxA@16
     
  4. 123dragon

    123dragon New Member

    Публикаций:
    0
    Регистрация:
    12 янв 2005
    Сообщения:
    46
    Адрес:
    Russia
    Код (Text):
    1. END_LOOP:
    2.         push [MSG.MSWPARAM]
    3.         CALL ExitProcess@4
    4.     _ERR:
    5.     jmp END_LOOP
     
  5. leo

    leo Active Member

    Публикаций:
    0
    Регистрация:
    4 авг 2004
    Сообщения:
    2.542
    Адрес:
    Russia
    123dragon

    Да все те же опечатки, не знаю чьи ;)
    Код (Text):
    1. --- вызов ---        --- объявлено ---
    2. CS_VRE[b]F[/b]RAW           CS_VREDRAW
    3. WNDEXTRA             [b]CLS[/b]WNDEXTRA DD ?
    4. CLSHCURSO[b]R[/b]           CLSHCURSO   DD ?
    5. NEWHWN[b]D[/b]              NEWHWN  DD 0
    6. SW_SHOWNORMAL        SW_SHOWN[b]9[/b]RMAL equ 1
    7. Dispa[b]tch[/b]MessageA@4   EXTERN Dispa[b]th[/b]MessageA@4:NEAR
    8. MessageBox[b]A[/b]@16       EXTERN MessageBox@16:NEAR
     
  6. mix_mix

    mix_mix Михаил

    Публикаций:
    0
    Регистрация:
    8 окт 2005
    Сообщения:
    277
    Адрес:
    Токио
    Кстати, на будущее: в той книге все примеры рабочие, сам по ней начинал.
     
  7. OlegA11

    OlegA11 New Member

    Публикаций:
    0
    Регистрация:
    12 фев 2006
    Сообщения:
    102
    Ассемблер сообщает на какой строчке есть ошибка. Вот и смотри на эту строчку.
     
  8. leo

    leo Active Member

    Публикаций:
    0
    Регистрация:
    4 авг 2004
    Сообщения:
    2.542
    Адрес:
    Russia
    123dragon

    Кстати на будущее ;)

    Все константы и структуры Win API со стандартными обозначениями полей описаны в masm32\include\windows.inc, а прототипы функций соответсвенно в kernel32.inc и т.д.

    Поэтому лучше пользоваться ими, а не городить отсебятину, даже если она исходит от самого г-на Пирогова ;)

    Сравни ради интереса объявления структуры WNDCLASS в msdn, windows.inc и твое (или Пирогова) и найди 10 различий ;))
     
  9. OlegA11

    OlegA11 New Member

    Публикаций:
    0
    Регистрация:
    12 фев 2006
    Сообщения:
    102
    LOL.

    Вобщем MSDN тебе в помошь. Очень советую прикупить.

    Удобно, когда он есть локально на машине.
     
  10. 123dragon

    123dragon New Member

    Публикаций:
    0
    Регистрация:
    12 янв 2005
    Сообщения:
    46
    Адрес:
    Russia
    Ребята, всем СПАСИБО!!!Тему закрываю.
     
Статус темы:
Закрыта.