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

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

Вернуться   Форум программистов > Низкоуровневое программирование > Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM
Регистрация

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 11.11.2008, 12:41   #1
AngelOfDeath
Delphi/C++/Asm
Форумчанин Подтвердите свой е-майл
 
Аватар для AngelOfDeath
 
Регистрация: 28.03.2008
Сообщений: 358
Вопрос Не работает исходник. В чём проблемма?

Не работают следующие исходники:
Даже не создаёт окно
1:
Код:
.386
.model flat, stdcall
option casemap:none

includelib ..\masm32\lib\kernel32.lib 
includelib ..\masm32\lib\user32.lib 

include ..\masm32\include\windows.inc 
include ..\masm32\include\kernel32.inc 
include ..\masm32\include\user32.inc 

.data
hInst dd 00000000h
WindowHWND dd ?
WinClass WNDCLASSEX<>
szTittleName         db "Window Application",0
szClassName       db "Window Application",0 

msg MONMSGSTRUCT<>


.code
start:
;###############################################################################
;########################Инициализация класса###################################
;###############################################################################

invoke GetModuleHandle,0
mov [hInst],eax

mov [WinClass.style], CS_HREDRAW + CS_VREDRAW

mov [WinClass.lpfnWndProc], offset WinProc

mov [WinClass.cbClsExtra], 0
mov [WinClass.cbWndExtra], 0
mov eax,[hInst]
mov [WinClass.hInstance],eax
invoke LoadIcon,0,IDI_APPLICATION
mov [WinClass.hIcon],eax
invoke LoadCursorA,0,IDC_ARROW
mov [WinClass.hCursor],eax
mov [WinClass.hbrBackground],COLOR_BTNFACE+1
mov dword ptr [WinClass.lpszMenuName],0
mov dword ptr [WinClass.lpszClassName],offset szClassName
invoke RegisterClassA, offset WinClass
;################################################################################
;###################Создание и показ окна########################################
;################################################################################
push 0
push [hInst]
push 0
push 0
push 500
push 500
push 0
push 0
push WS_OVERLAPPEDWINDOW
push offset szTittleName
push offset szClassName
push 0
call CreateWindowEx


mov [WindowHWND], eax






invoke ShowWindow, [WindowHWND], SW_SHOW
invoke UpdateWindow,[WindowHWND]


;################################################################################
;##############################Сообщения#########################################
;################################################################################


message_loop:
invoke GetMessage,offset msg,0,0,0 
invoke TranslateMessage, offset msg
invoke DispatchMessage, offset msg
jmp message_loop
end_loop:
invoke ExitProcess, 0





WinProc proc  hwnd:DWORD, message:DWORD, wParam:DWORD, lParam:DWORD

cmp [message], WM_DESTROY
je Close


Invoke DefWindowProcA,[hwnd],[message],[wParam],[lParam] 




jmp finish

Close:
invoke PostQuitMessage, 0 
invoke ExitProcess, 0 ; выход 




finish:
ret
WinProc endp


end start
Этот создаёт окно и виснет намертво
2:
Код:
.386
.model flat,stdcall
option casemap:none 



includelib ..\masm32\lib\kernel32.lib 
includelib ..\masm32\lib\user32.lib 

include ..\masm32\include\windows.inc 
include ..\masm32\include\kernel32.inc 
include ..\masm32\include\user32.inc 



.data
hInst dd 00000000h
hWnd dd 0
WinClass WNDCLASSEX<>
szClassName db "Windows Application"
szTitle db "Windows приложеньище!"
msg MONMSGSTRUCT<>
.code
start:
invoke GetModuleHandleA, 0
mov [hInst],eax
mov [WinClass.cbSize],sizeof WNDCLASSEX
mov [WinClass.style],CS_HREDRAW or CS_VREDRAW
mov [WinClass.lpfnWndProc], offset WinProc
mov [WinClass.cbClsExtra],0
mov [WinClass.cbWndExtra],0
mov eax, hInst
mov [WinClass.hInstance], eax
mov [WinClass.hbrBackground],COLOR_BTNFACE+1
mov [WinClass.lpszClassName],offset szClassName
invoke LoadIcon,0,IDI_APPLICATION
mov [WinClass.hIcon],EAX
invoke LoadCursor,0,IDC_ARROW
mov [WinClass.hCursor], EAX
mov [WinClass.hIconSm],0
invoke RegisterClassEx,  ADDR WinClass

invoke CreateWindowEx,0, addr szClassName, addr szTitle,
WS_OVERLAPPEDWINDOW, CW_USEDEFAULT,CW_USEDEFAULT,CW_USEDEFAULT,CW_USEDEFAULT,
0, 0, hInst, 0
mov hWnd,eax

invoke ShowWindow, [hWnd], SW_SHOWNORMAL
invoke UpdateWindow,  [hWnd]

message_loop:
invoke GetMessage,offset msg,0,0,0 
invoke TranslateMessage, offset msg
invoke DispatchMessage, offset msg
jmp message_loop



WinProc proc hwnd:DWORD, uMsg:DWORD, wParam:DWORD, lParam:DWORD
cmp [uMsg],WM_DESTROY
je Destroy





jmp finish
;Тут все обработчики
Destroy:
invoke PostQuitMessage,0
invoke ExitProcess,0

;Тут заканчивается процедура
finish:
ret
WinProc endp


end start
В чём проблема?
AngelOfDeath вне форума Ответить с цитированием
Старый 11.11.2008, 18:55   #2
Ulex
Непрофессионал
Участник клуба
 
Аватар для Ulex
 
Регистрация: 01.01.2008
Сообщений: 1,405
По умолчанию

Немного переделал второй пример, у меня стал запускаться и перестал повисать

Код:
.386
.model flat,stdcall
option casemap:none 

includelib \masm32\lib\kernel32.lib 
includelib \masm32\lib\user32.lib 

include win32.inc 
include \masm32\include\kernel32.inc 
include \masm32\include\user32.inc 

.data
hInst dd 00000000h
hWnd dd 0
WinClass WNDCLASSEX<>
szClassName db "Windows Application"
szTitle db "Windows ïðèëîæåíüèùå!"
msg MSGSTRUCT<>
.code
start:
invoke GetModuleHandleA, 0
mov [hInst],eax
mov [WinClass.cbSize],sizeof WNDCLASSEX
mov [WinClass.style], CS_HREDRAW or CS_VREDRAW
mov [WinClass.lpfnWndProc], offset WinProc
mov [WinClass.cbClsExtra],0
mov [WinClass.cbWndExtra],0
mov eax, hInst
mov [WinClass.hInstance], eax
mov [WinClass.hbrBackground],COLOR_BTNFACE+1
mov [WinClass.lpszClassName],offset szClassName
invoke LoadIcon,0,IDI_APPLICATION
mov [WinClass.hIcon],EAX
invoke LoadCursor,0,IDC_ARROW
mov [WinClass.hCursor], EAX
mov [WinClass.hIconSm],0
invoke RegisterClassEx,  ADDR WinClass
invoke CreateWindowEx,0, addr szClassName, addr szTitle, \
WS_VISIBLE+WS_DLGFRAME+WS_SYSMENU+WS_GROUP, CW_USEDEFAULT, CW_USEDEFAULT, 500, 500, \
0, 0, hInst, 0
mov hWnd,eax
invoke ShowWindow, [hWnd], SW_SHOWNORMAL
invoke UpdateWindow,  [hWnd]

message_loop:
invoke GetMessage,offset msg,0,0,0 
cmp	eax, 0
je	end_loop
invoke TranslateMessage, offset msg
invoke DispatchMessage, offset msg
jmp message_loop
end_loop:
invoke    ExitProcess, [msg.msWPARAM]

WinProc proc hwnd:DWORD, uMsg:DWORD, wParam:DWORD, lParam:DWORD
cmp [uMsg],WM_DESTROY
je Destroy
invoke	DefWindowProcA, [hwnd],[uMsg],[wParam],[lParam]
jmp finish
Destroy:
invoke PostQuitMessage,0
invoke ExitProcess,0
finish:
ret
WinProc endp
end start
Чего поменял:
1. структура сообщения MSGSTRUCT
2. В петлю обработки сообщений - cmp eax, 0 - ну так, на всякий случай
3. Самое главное, в оконной функции - invoke DefWindowProcA, [hwnd],[uMsg],[wParam],[lParam], надо обязательно

P.S.
на строчку include win32.inc внимания не обращайте, просто я люблю самоделошные инклюды пользовать.
И чем больше я узнавал людей, тем больше мне нравились компьютеры.
------------------------------------
Страничка с моими программками http://ulex-masm.ru
Ulex вне форума Ответить с цитированием
Старый 11.11.2008, 18:58   #3
Д'якон
Форумчанин
 
Регистрация: 05.12.2007
Сообщений: 236
По умолчанию

1и2. Прога не выходит из цикла обработки сообщений. ExitProcess - не вызывается из процедуры окна. Где прототип процедуры окна? WinProc - вроде прописан в windows.inc измени название. И воспользуйся отладчиком
Д'якон вне форума Ответить с цитированием
Старый 11.11.2008, 18:58   #4
rpy3uH
добрый няша
Старожил
 
Аватар для rpy3uH
 
Регистрация: 29.10.2006
Сообщений: 4,804
По умолчанию

Цитата:
Сообщение от AngelOfDeath Посмотреть сообщение
Этот создаёт окно и виснет намертво
во втором примере ты не вызываешь функцию DefWindowProc. Вызывай после метки finish: в процедуре WinProc

Последний раз редактировалось rpy3uH; 11.11.2008 в 19:03.
rpy3uH вне форума Ответить с цитированием
Старый 13.11.2008, 12:12   #5
AngelOfDeath
Delphi/C++/Asm
Форумчанин Подтвердите свой е-майл
 
Аватар для AngelOfDeath
 
Регистрация: 28.03.2008
Сообщений: 358
По умолчанию

Цитата:
Где прототип процедуры окна? WinProc - вроде прописан в windows.inc измени название.
В windows.inc вообще только всякие структуры
И замены цифровых значений (пример: 80000000h) на более понятные (WS_POPUP)
Код:
WS_POPUP                             equ 80000000h
WS_CHILD                             equ 40000000h
Всем спасибо. Всё работает.
AngelOfDeath вне форума Ответить с цитированием
Старый 13.11.2008, 18:38   #6
Д'якон
Форумчанин
 
Регистрация: 05.12.2007
Сообщений: 236
По умолчанию

Там не только структуры и константы, посмотри внимательно
Д'якон вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
На чём же остановиться? Twodi Компьютерное железо 11 17.02.2009 10:48
В чём ошибка??? pasha_1 Общие вопросы C/C++ 11 25.11.2008 01:26
Не компилится данный исходник. В чём проблемма? AngelOfDeath Общие вопросы C/C++ 4 16.10.2008 00:34
Не понимаю в чём ошибка Editor Общие вопросы Delphi 4 24.04.2008 08:00