|
|
Регистрация Восстановить пароль |
Повторная активизация e-mail |
Регистрация | Задать вопрос |
Заплачу за решение |
Новые сообщения |
Сообщения за день |
Расширенный поиск |
Правила |
Всё прочитано |
|
Опции темы | Поиск в этой теме |
07.11.2010, 13:46 | #1 |
Пользователь
Регистрация: 29.10.2010
Сообщений: 31
|
WINDOWS-окна на асме
Доброго всем времени суток. Недавно начал изучать ассемблер и попробовал создать окно. Прога окно не создала, а GetLastError возвращает 0. Помогите, плз.
Вот исходник: .386 .MODEL flat, stdcall option casemap :none includelib D:\MASM32\lib\kernel32.lib includelib D:\MASM32\lib\user32.lib include D:\MASM32\INCLUDE\windows.inc EXTERN GetModuleHandleA@4:NEAR EXTERN LoadIconA@8:NEAR EXTERN MessageBeep@4:NEAR EXTERN MessageBoxA@16:NEAR EXTERN LoadCursorA@8:NEAR EXTERN RegisterClassA@4:NEAR EXTERN ExitProcess@4:NEAR EXTERN GetLastError@0:NEAR EXTERN wsprintfA:NEAR EXTERN CreateWindowA@44:NEAR EXTERN GetMessageA@16:NEAR EXTERN TranslateMessage@4:NEAR EXTERN DispatchMessageA@4:NEAR EXTERN PostQuitMessage@4:NEAR EXTERN DefWindowProcA@16:NEAR DATA SEGMENT WndClsStruc WNDCLASS <?> LoadIconERR DB 'Ïîìèëêà ïðè çàãðóçö³ ³êîíêè.',0 LoadCursERR DB 'Ïîìèëêà ïðè çàãðóçö³ êóðñîðà.',0 wndTittle DB 'Ïðîãðàìà ðîáîòè ç áàçîþ ñóì³øåé',0 wndCls DB 'BaseRedag',0 hInst DD ? message MSG <?> clsERRmes DB 'Ïîìèëêà ñòâîðåííÿ êëàñó ¹%ld',0 DB 10 dup (?) wndCrERRmes DB 'Ïîìèëêà ñòâîðåííÿ â³êíà ¹%ld',0 DB 10 dup (?) DATA ENDS CODE SEGMENT START: mov WndClsStruc.style,CS_HREDRAW or CS_VREDRAW mov WndClsStruc.lpfnWndProc,offset wndProc mov WndClsStruc.cbClsExtra,0 mov WndClsStruc.cbWndExtra,0 push 0 call GetModuleHandleA@4 mov hInst,EAX mov WndClsStruc.hInstance,EAX push IDI_ASTERISK push 0 call LoadIconA@8 test EAX,EAX jne short W1 push MB_ICONEXCLAMATION call MessageBeep@4 push MB_OK or MB_ICONERROR or MB_TOPMOST push offset wndTittle push offset LoadCursERR push 0 call MessageBoxA@16 W1: mov WndClsStruc.hIcon,EAX push IDC_ARROW push 0 call LoadCursorA@8 test EAX,EAX jne short W2 push MB_ICONEXCLAMATION call MessageBeep@4 push MB_OK or MB_ICONERROR or MB_TOPMOST push offset wndTittle push offset LoadIconERR push 0 call MessageBoxA@16 W2: mov WndClsStruc.hCursor,EAX mov WndClsStruc.hbrBackground,COLOR_BAC KGROUND mov WndClsStruc.lpszMenuName,0 mov WndClsStruc.lpszClassName,offset wndCls push offset WndClsStruc call RegisterClassA@4 test EAX,EAX je clsERR push 0;lpParam push hInst;hInstance push 0;hMenu push 0;hWndParent push 300;nHeight push 500;nWidth push CW_USEDEFAULT;y push CW_USEDEFAULT;x push WS_OVERLAPPEDWINDOW push offset wndTittle push offset wndCls call CreateWindowA@44 test EAX,EAX je short wndCrERR MSG_LOOP: push 0 push 0 push 0 push offset message call GetMessageA@16 test EAX,EAX je short exit push offset message call TranslateMessage@4 push offset message call DispatchMessageA@4 jmp short MSG_LOOP wndProc proc hwnd equ DWORD PTR [EBP + 8] msg equ DWORD PTR [EBP + 12] wParam equ DWORD PTR [EBP + 16] lParam equ DWORD PTR [EBP + 20] ENTER 0,0 cmp msg,WM_DESTROY je short WMDESTROY push lParam push wParam push msg push hwnd call DefWindowProcA@16 wndPrEXT: mov EAX,0 LEAVE retn WMDESTROY: push 0 call PostQuitMessage@4 jmp short wndPrEXT wndProc ENDP wndCrERR: call GetLastError@0 push EAX push offset wndCrERRmes push offset wndCrERRmes call wsprintfA add ESP,12 push MB_OK or MB_ICONERROR or MB_TOPMOST push offset wndTittle push offset wndCrERRmes push 0 call MessageBoxA@16 exit: push 0 call ExitProcess@4 clsERR: call GetLastError@0 push EAX push offset clsERRmes push offset clsERRmes call wsprintfA add ESP,12 push MB_OK or MB_ICONERROR or MB_TOPMOST push offset wndTittle push offset clsERRmes push 0 call MessageBoxA@16 jmp short exit CODE ENDS END START
В гостях - хорошо. Дома – лучше. В пути туда и обратно - терпимо. Стоять в проходе и по пол часа прощаться – ужасно.
|
13.02.2011, 12:06 | #2 |
Пользователь
Регистрация: 29.10.2010
Сообщений: 31
|
Поставил все имена переменных при командах в кавычки: []. И сразу заработало! Вопрос: как masm32 воспринимает имена переменных без кавычек?
В гостях - хорошо. Дома – лучше. В пути туда и обратно - терпимо. Стоять в проходе и по пол часа прощаться – ужасно.
|
13.02.2011, 12:21 | #3 |
добрый няша
Старожил
Регистрация: 29.10.2006
Сообщений: 4,804
|
по идее он должен их принимать как указатели, но он почему-то так делает
Вообще в MASM следующие записи полностью идентичны mov eax, param mov eax, [param] поэтому я перешёл на FASM |
17.02.2011, 19:10 | #4 |
Пользователь
Регистрация: 29.10.2010
Сообщений: 31
|
Если он так делает, то почему когда я заменил все param на [param] (кроме тех, что с префиксом offset) прога вдруг заработала?
В гостях - хорошо. Дома – лучше. В пути туда и обратно - терпимо. Стоять в проходе и по пол часа прощаться – ужасно.
|
23.02.2011, 13:23 | #5 |
Адский тунеядец
Форумчанин
Регистрация: 11.06.2010
Сообщений: 164
|
Я сейчас лично попробовал написать окно. Вот так я вызывал функцию DefWindowProc
push lParam push wParam push uMsg push hWnd call DefWindowProc Все работает! Потом заменил вот так push lParam push [wParam] push uMsg push hWnd call DefWindowproc Все работает на УРА! Посмотри - может ты ещё чего нибудь изменил, потому что как говорит Гру3ин - в макро ассемблере [..] и просто .. идентичны. |
21.03.2011, 10:17 | #6 |
Пользователь
Регистрация: 29.10.2010
Сообщений: 31
|
Я думаю, что раз работает, то лучше не трогать... В общем, спасибо всем! Думаю, тему можно закрывать.
В гостях - хорошо. Дома – лучше. В пути туда и обратно - терпимо. Стоять в проходе и по пол часа прощаться – ужасно.
|
21.03.2011, 12:06 | #7 |
Пользователь
Регистрация: 29.10.2010
Сообщений: 31
|
Как ни смешно бы это не звучало, но буквально через 10 мин. эта же проблема возникла с созданием окна MDICLIENT. Так что тему, плз, не закрывайте. Попробую всё-таки найти ошибку.
В гостях - хорошо. Дома – лучше. В пути туда и обратно - терпимо. Стоять в проходе и по пол часа прощаться – ужасно.
|
21.03.2011, 17:01 | #8 |
Пользователь
Регистрация: 29.10.2010
Сообщений: 31
|
Проверил, какую ошибку оно выдаёт. GetLastError возвращает ERROR_CANNOT_FIND_WND_CLASS, хотя тазвание стандартного класа я копировал из WIN32.hlp. И как это называть?
В гостях - хорошо. Дома – лучше. В пути туда и обратно - терпимо. Стоять в проходе и по пол часа прощаться – ужасно.
|
Похожие темы | ||||
Тема | Автор | Раздел | Ответов | Последнее сообщение |
шифрование текста на асме | Lolipo | Помощь студентам | 1 | 28.10.2010 10:28 |
Окна как будто в Windows | bookkc | JavaScript, Ajax | 3 | 16.08.2010 19:03 |
Закрытие окна windows | niva622 | Помощь студентам | 3 | 11.04.2010 19:39 |
значения стилей окна Windows. | HWork | Общие вопросы C/C++ | 4 | 25.09.2009 09:26 |
Окна в windows | Женька | Помощь студентам | 3 | 18.06.2008 13:15 |