Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Низкоуровневое программирование > Win Api
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 07.11.2010, 13:46   #1
DinoAsm
Пользователь
 
Аватар для DinoAsm
 
Регистрация: 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
В гостях - хорошо. Дома – лучше. В пути туда и обратно - терпимо. Стоять в проходе и по пол часа прощаться – ужасно.
DinoAsm вне форума Ответить с цитированием
Старый 13.02.2011, 12:06   #2
DinoAsm
Пользователь
 
Аватар для DinoAsm
 
Регистрация: 29.10.2010
Сообщений: 31
Лампочка

Поставил все имена переменных при командах в кавычки: []. И сразу заработало! Вопрос: как masm32 воспринимает имена переменных без кавычек?
В гостях - хорошо. Дома – лучше. В пути туда и обратно - терпимо. Стоять в проходе и по пол часа прощаться – ужасно.
DinoAsm вне форума Ответить с цитированием
Старый 13.02.2011, 12:21   #3
rpy3uH
добрый няша
Старожил
 
Аватар для rpy3uH
 
Регистрация: 29.10.2006
Сообщений: 4,804
По умолчанию

по идее он должен их принимать как указатели, но он почему-то так делает
Вообще в MASM следующие записи полностью идентичны
mov eax, param
mov eax, [param]
поэтому я перешёл на FASM
rpy3uH вне форума Ответить с цитированием
Старый 17.02.2011, 19:10   #4
DinoAsm
Пользователь
 
Аватар для DinoAsm
 
Регистрация: 29.10.2010
Сообщений: 31
Вопрос

Цитата:
Сообщение от rpy3uH Посмотреть сообщение
Вообще в MASM следующие записи полностью идентичны
mov eax, param
mov eax, [param]
Если он так делает, то почему когда я заменил все param на [param] (кроме тех, что с префиксом offset) прога вдруг заработала?
В гостях - хорошо. Дома – лучше. В пути туда и обратно - терпимо. Стоять в проходе и по пол часа прощаться – ужасно.
DinoAsm вне форума Ответить с цитированием
Старый 23.02.2011, 13:23   #5
Ibanez Wizard
Адский тунеядец
Форумчанин
 
Аватар для Ibanez Wizard
 
Регистрация: 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ин - в макро ассемблере [..] и просто .. идентичны.
Ibanez Wizard вне форума Ответить с цитированием
Старый 21.03.2011, 10:17   #6
DinoAsm
Пользователь
 
Аватар для DinoAsm
 
Регистрация: 29.10.2010
Сообщений: 31
По умолчанию

Я думаю, что раз работает, то лучше не трогать... В общем, спасибо всем! Думаю, тему можно закрывать.
В гостях - хорошо. Дома – лучше. В пути туда и обратно - терпимо. Стоять в проходе и по пол часа прощаться – ужасно.
DinoAsm вне форума Ответить с цитированием
Старый 21.03.2011, 12:06   #7
DinoAsm
Пользователь
 
Аватар для DinoAsm
 
Регистрация: 29.10.2010
Сообщений: 31
Восклицание

Как ни смешно бы это не звучало, но буквально через 10 мин. эта же проблема возникла с созданием окна MDICLIENT. Так что тему, плз, не закрывайте. Попробую всё-таки найти ошибку.
В гостях - хорошо. Дома – лучше. В пути туда и обратно - терпимо. Стоять в проходе и по пол часа прощаться – ужасно.
DinoAsm вне форума Ответить с цитированием
Старый 21.03.2011, 17:01   #8
DinoAsm
Пользователь
 
Аватар для DinoAsm
 
Регистрация: 29.10.2010
Сообщений: 31
По умолчанию

Проверил, какую ошибку оно выдаёт. GetLastError возвращает ERROR_CANNOT_FIND_WND_CLASS, хотя тазвание стандартного класа я копировал из WIN32.hlp. И как это называть?
В гостях - хорошо. Дома – лучше. В пути туда и обратно - терпимо. Стоять в проходе и по пол часа прощаться – ужасно.
DinoAsm вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
шифрование текста на асме 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