Купил книгу "Ассемблер для Windows" 3-е издание Пирагова, стал набирать пример, возникли ошибки, нашел отпечатки - исправил - все равно возникли ошибки, автор на письмо не отвечает. Если кому не лень скажите что здесь не то. Код (Text): .586 ;плоская модель памяти .MODEL FLAT, stdcall ;константы ;сообщение приходит при закрытии окна WM_DESTROY EQU 2 ;сообщение приходит при закрытии окна WM_CREATE EQU 1 ;сообщение при щелчке левой кнопкой мыши в области окна WM_LBUTTONDOWN EQU 201h ;сообщение при щелчке правой кнопкой мыши в области окна WM_RBUTTONDOWN EQU 204h ;свойство окна CS_VREDRAW EQU 1h CS_HREDRAW EQU 2h CS_GLOBALCLASS EQU 4000h WS_OVERLAPPEDWINDOW EQU 00CF0000H style equ CS_HREDRAW+CS_VREFRAW+CS_GLOBALCLASS ;индификатор стандатрной пинтограммы IDI_APPLICATION EQU 32512 ;индитификатор курсора IDC_CROSS EQU 32512 ;режим показа нормальный SW_SHOWN9RMAL equ 1 ;прототипы внешних процедур EXTERN MessageBox@16:NEAR EXTERN CreateWindowExA@48:NEAR EXTERN DefWindowProcA@16:NEAR EXTERN DispathMessageA@4:NEAR EXTERN ExitProcess@4:NEAR EXTERN GetMessageA@16:NEAR EXTERN GetModuleHandleA@4:NEAR EXTERN LoadCursorA@8:NEAR EXTERN LoadIconA@8:NEAR EXTERN PostQuitMessage@4:NEAR EXTERN RegisterClassA@4:NEAR EXTERN ShowWindow@8:NEAR EXTERN TranslateMessage@4:NEAR EXTERN UpdateWindow@4:NEAR ;директивы компоновщику для подключения библиотек includelib c:\masm32\lib\user32.lib includelib c:\masm32\lib\kernel32.lib ;------------------------------------------------ ;структуры ;структура сообщения MSGSTRUCT STRUC MSHWND DD ? ;ИНДЕНТИФИКАТОР ОКНА, ПОЛУЧАЮЩЕГО СООБЩЕНИЯ MSMESSAGE DD ? ;ИНДЕНТИФИКАТОР СООБЩЕНИЯ MSWPARAM DD ? ;ДОП. ИНФОРМАЦИЯ О СООБЩЕНИИ MSLPARAM DD ? ;ДОП. ИНФОРМАЦИЯ О СООБЩЕНИИ MSTIME DD ? ;ВРЕМЯ ПОСЫЛКИ СООБЩЕНИЯ MSPT DD ? ;ПОЛОЖЕНИЕ КУРСОРА ВО ВРЕМЯ ПОСЫЛКИ СООБЩЕНИЯ MSGSTRUCT ends WNDCLASS STRUC CLSSTYLE DD ? ;стиль окна CLWNDPROC DD ? ;указатель на процедуру окна CLSCEXTRA DD ? ;информация о дополнительных байтах для окна CLSWNDEXTRA DD ? ;информация о доп. байтах для окна CLSHINSTANCE DD ? ;дескриптор приложения CLSHICON DD ? ;индентификатор пиктограммы окна CLSHCURSO DD ? ;индентификатор курсора CLBKGROUND DD ? ;индентификатор кисти окна CLMENUNAME DD ? ;имя-индефикатор меню CLNAME DD ? ;специфицирует имя класса окна WNDCLASS ends ;сегмент данных _DATA SEGMENT NEWHWN DD 0 MSG MSGSTRUCT <?> WC WNDCLASS <?> HINST DD 0 ;здесь хранится дескриптор приложения TITLENAME DB 'ПРОСТОЙ ПРИМЕР 32-БИТНОГО ПРИЛОЖЕНИЯ',0 CLASSNAME DB 'CLASS32',0 CAP DB 'Сообщение',0 MES1 DB 'Вы нажали левую кнопку мыши',0 MES2 DB 'Выход из программы, Пока!',0 _DATA ENDS ;СЕГМЕНТ КОДА _TEXT SEGMENT START: ;получить дискриптор приложения push 0 call GetModuleHandleA@4 mov [HINST],eax REG_CLASS: ;заполнить структуру окна ;стиль mov [WC.CLSSTYLE],style ;процедура обработки сообщения mov [WC.CLWNDPROC], offset WNDPROC mov [WC.CLSCEXTRA],0 mov [WC.WNDEXTRA],0 mov eax, [HINST] mov [WC.CLSHINSTANCE],eax ;пинтограмма окна push IDI_APPLICATION push 0 call LoadIconA@8 mov [WC.CLSHICON],eax ;курсор окна push IDC_CROSS push 0 call LoadCursorA@8 mov [WC.CLSHCURSOR],eax ;-------------------------- mov [WC.CLBKGROUND],17 ;цвет окна mov DWORD PTR [WC.CLMENUNAME],0 mov DWORD PTR [WC.CLNAME], OFFSET CLASSNAME push OFFSET WC call RegisterClassA@4 ;создать окно зарегистрированного класса push 0 push [HINST] push 0 push 0 push 400 ;DY - высота окна push 400 ;DX - ширина окна push 100 ;Y -коорд. левого верхнего угла push 100 ;X -коорд. левого верхнего угла push WS_OVERLAPPEDWINDOW push OFFSET TITLENAME ;имя окна push OFFSET CLASSNAME ;имя класса push 0 call CreateWindowExA@48 ;проверка на ошибку cmp eax,0 jz _ERR mov [NEWHWND], eax ;дескриптор окна ;---------------------------- push SW_SHOWNORMAL push [NEWHWND] call ShowWindow@8 ;показать созданное окно ;---------------------------- push [NEWHWND] call UpdateWindow@4 ;комманда перерисовать видимую часть окна, сообщение WM_PAINT ;цикл обработки сообщений MSG_LOOP: PUSH 0 PUSH 0 PUSH 0 PUSH OFFSET MSG CALL GetMessageA@16 CMP EAX,0 JE END_LOOP PUSH OFFSET MSG CALL TranslateMessage@4 PUSH OFFSET MSG CALL DispatchMessageA@4 JMP MSG_LOOP END_LOOP: JMP END_LOOP ;------------------------------ ;ПРОЦЕДУРА ОКНА ;расположение параметров в стеке ;[EBP+014H] LPARAM ;[EBP+10H] WAPARAM ;[EBP+OCH] MES ;[EBP+8] HWND WNDPROC PROC PUSH EBP MOV EBP,ESP PUSH EBX PUSH ESI PUSH ESI PUSH EDI CMP DWORD PTR [EBP+0CH],WM_DESTROY JE WMDESTROY CMP DWORD PTR [EBP+0CH],WM_CREATE JE WMCREATE CMP DWORD PTR [EBP+0CH],WM_LBUTTONDOWN ;левая кнопка мыши JE LBUTTON CMP DWORD PTR [EBP+0CH],WM_RBUTTONDOWN ;правая кнопка мыши JE RBUTTON JMP DEFWNDPROC ;нажатие правой кнопки приводит к закрытию окна RBUTTON: JMP WMDESTROY ;нажатие левой кнопки мышы LBUTTON: ;выводим сообщение PUSH 0 ;MB_OK PUSH OFFSET CAP PUSH OFFSET MES1 PUSH DWORD PTR [EBP+08H] CALL MessageBoxA@16 MOV EAX,0 JMP FINISH WMCREATE: MOV EAX,0 JMP FINISH DEFWNDPROC: PUSH DWORD PTR [EBP+14H] PUSH DWORD PTR [EBP+10H] PUSH DWORD PTR [EBP+0CH] PUSH DWORD PTR [EBP+08H] CALL DefWindowProcA@16 JMP FINISH WMDESTROY: PUSH 0 ;MB_OK PUSH OFFSET CAP PUSH OFFSET MES2 PUSH DWORD PTR [EBP+08H] ;декриптор окна CALL MessageBoxA@16 PUSH 0 CALL PostQuitMessage@4 ;сообщение WM_QUIT MOV EAX,0 FINISH: POP EDI POP ESI POP EBX POP EBP ret 16 WNDPROC endp _TEXT ENDS END START
Ошибки нужно искать самому. Или ты никогда ничему не научишся. Никто не хочет делать за других, их работу. Учи ассемблер, разберайся, что к чему, а ошибка сама найдётся. Ещё: Если уж просишь, найти ошибку, опиши её.
Описание ошибок: 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
123dragon Да все те же опечатки, не знаю чьи Код (Text): --- вызов --- --- объявлено --- CS_VRE[b]F[/b]RAW CS_VREDRAW WNDEXTRA [b]CLS[/b]WNDEXTRA DD ? CLSHCURSO[b]R[/b] CLSHCURSO DD ? NEWHWN[b]D[/b] NEWHWN DD 0 SW_SHOWNORMAL SW_SHOWN[b]9[/b]RMAL equ 1 Dispa[b]tch[/b]MessageA@4 EXTERN Dispa[b]th[/b]MessageA@4:NEAR MessageBox[b]A[/b]@16 EXTERN MessageBox@16:NEAR
123dragon Кстати на будущее Все константы и структуры Win API со стандартными обозначениями полей описаны в masm32\include\windows.inc, а прототипы функций соответсвенно в kernel32.inc и т.д. Поэтому лучше пользоваться ими, а не городить отсебятину, даже если она исходит от самого г-на Пирогова Сравни ради интереса объявления структуры WNDCLASS в msdn, windows.inc и твое (или Пирогова) и найди 10 различий )