набрал код на масме:
(директивы масма стараюсь сильно не использовать, приближенно к чистому ассемблеру)
Цитата:
.386p
.MODEL FLAT, STDCALL
; -------------------------------------------------------------------------
EXTERN MessageBoxA@16:near
EXTERN CreateWindowExA@48:near
EXTERN DefWindowProcA@16:near
EXTERN DispatchMessageA@4:near
EXTERN ExitProcess@4:near
EXTERN GetMessageA@16:near
EXTERN GetModuleHandleA@4:near
EXTERN PostQuitMessage@4:near
EXTERN RegisterClassA@4:near
EXTERN ShowWindow@8:near
EXTERN TranslateMessage@4:near
EXTERN UpdateWindow@4:near
EXTERN LoadCursorA@8:NEAR
EXTERN LoadIconA@8:NEAR
includelib lib\kernel32.lib
includelib lib\user32.lib
wndclass struc
classstyle dd ?
clwndproc dd ?
clscextra dd ?
clwndextra dd ?
clshinstance dd ?
clshicon dd ?
clshcursor dd ?
clbground dd ?
clmenuname dd ?
clname dd ?
wndclass ends
msgs struc
mshwnd dd ?
msmessage dd ?
mswparam dd ?
mslparam dd ?
mstime dd ?
mspt dd ?
msgs ends
.data
classname db 'ASMCLASS32',0
titlename db 'win win win hehehe',0
hinst dd 0
wc wndclass <?>
nhwnd dd 0
msg msgs <?>
cap db 'message!',0
textmess db 'r button!',0
textmess2 db 'CREATE!!!!',0
; -------------------------------------------------------------------------
.code
START:
push 0
call GetModuleHandleA@4
mov [hinst],eax
mov [wc.classstyle],4003h
mov [wc.clwndproc],offset wndproc
mov [wc.clscextra],0
mov [wc.clwndextra],0
mov eax,[hinst]
mov [wc.clshinstance],eax
push 32512
push 0
call LoadIconA@8
mov wc.clshicon,eax
push 32512
push 0
call LoadCursorA@8
mov wc.clshcursor,eax
mov wc.clbground,5
mov wc.clmenuname,0
mov wc.clname,offset classname
push offset wc
call RegisterClassA@4
push 0
push [hinst]
push 0
push 0
push 80000000h
push 80000000h
push 80000000h
push 80000000h
push 0CF0000h
push offset titlename
push offset classname
push 0
call CreateWindowExA@48
mov [nhwnd],eax
push 1
push [nhwnd]
call ShowWindow@8
push [nhwnd]
call UpdateWindow@4
msg_loop:
push 0
push 0
push 0
push offset msg
call GetMessageA@16
cmp ax,0
jz end_loop
push offset msg
call TranslateMessage@4
push offset msg
call DispatchMessageA@4
jmp msg_loop
end_loop:
push 0
call ExitProcess@4
; -------------------------------------------------------------------------
wndproc proc
push ebp
mov ebp,esp
push ebx
push esi
push edi
cmp dword ptr [ebp+0Ch],2h
jz wmdestroy
cmp dword ptr [ebp+0Ch],1h
jz wmcreate
cmp dword ptr [ebp+0Ch],204
jz wmrbutton
push dword ptr [ebp+14h]
push dword ptr [ebp+10h]
push dword ptr [ebp+0Ch]
push dword ptr [ebp+08h]
call DefWindowProcA@16
mov eax,0
jmp finish
wmcreate:
push offset cap
push offset textmess2
call mess
mov eax,0
jmp finish
wmrbutton:
push offset cap
push offset textmess
call mess
mov eax,0
jmp finish
wmdestroy:
push 0
call PostQuitMessage@4
mov eax,0
finish:
pop edi
pop esi
pop ebx
pop ebp
ret 16
wndproc endp
mess proc
push ebp
mov ebp,esp
push 0
push dword ptr [ebp+12]
push dword ptr [ebp+8]
push 0
call MessageBoxA@16
mov esp,ebp
pop ebx
ret 8
mess endp
END START
|
Он всего-то и делает, что создаёт окно, ну и пара обработок сообщений. Но вот проблема - функция сознания окна CreateWindowExA постоянно в ЕАХ возвращает 0, то бишь происходит ошибка - смотрел в отладчике. Не хочет создавать окно... В чём моя ошибка? Почему код не работатет? Всем Спасибо за ответы! ++++
Огромная просьба не давать ссылки на рабочие примеры. У меня они есть, но почему-то они работают, а мой код - нет... даже незнаю почему - в отладчике почти 1 в 1 ....
|