Skip to content

Instantly share code, notes, and snippets.

Embed
What would you like to do?
include includes\win64a.inc
.code
WinMain proc
local msg:MSG
xor ebx,ebx ;rbx = 0
mov esi,IMAGE_BASE ; дескриптор нашей программы
mov eax,10027h ; дескриптор иконки
mov edi,offset ClassName; Имя нашего класса окна
; заполнение структуры wc и регистрация класса
push rax ;hIconSm дескриптор малой иконки
push rdi ;lpszClassName Имя класса окна
push rbx ;lpszMenuName меню
push COLOR_WINDOW;hbrBackground Цвет фона
push 10003h ;hCursor дескриптор курсора
push rax ;hIcon дескриптор иконки
push rsi ;hInstance дескриптор модуля
push rbx ;cbClsExtra & cbWndExtra
pushaddr WndProc ;lpfnWndProc
;Адрес процедуры окна, ответственной за окна, создаваемых на основе этого класса
push sizeof WNDCLASSEX;cbSize & style
;Стиль окон, создаваемых из этого класса. Вы можете
;комбинировать несколько стилей вместе, используя оператор "or".
invoke RegisterClassEx,esp ;rsp = addr WNDCLASSEX
;регистрация нашего класса окна
;После регистрации класса окна, мы должны вызвать CreateWindowEx,
;чтобы создать наше окно, основанное на этом классе
;--------------------------+
; creating the main window |
;--------------------------+
push rbx ;lрParam: Опциональный указатель на структуру данных,
;передаваемых окну. Это используется окнами MDI, чтобы передать структуру
;CLIENTCREATESTRUCT. Обычно этот параметр установлен в NULL, означая, что
;никаких данных не передается через CreateWindow(). Окно может получать значение
;этого параметра через вызов функции GetWindowsLong.
push rsi ;rsi=400000h hInstance: дескриптор программного модуля, создающего окно
shl esi,9 ;rsi=CW_USEDEFAULT
push rbx ;hMenu: дескриптор меню окна. NULL - если будет использоваться меню,
;определенное в классе окна. Взгляните на код, объясненный ранее, член структуры
;WNDCLASSEX lрszMenuName. Он определяет меню "по умолчанию" для класса окна.
;Каждое окно, созданное из этого класса будет иметь тоже меню по умолчанию, до
;тех пор пока вы не определите специально меню для какого-то окна, используя
;параметр hMenu. Этот параметр - двойного назначения. В случае, если ваше окно
;основано на предопределенном классе окна, оно не может иметь меню. Тогда hMenu
;используется как ID этого контрола. Windows может определить действительно ли
;hMenu - это дескриптор меню или же ID контрола, проверив параметр lрClassName. Если
;это имя предопределенного класса, hMenu - это идентификатор контрола. Если нет,
;это дескриптор меню окна
push rbx ;hWndParent: дескриптор родительского окна (если существует). Этот
;параметр говорит Windows является ли это окно дочерним (подчиненным) другого
;окна, и, если так, кто родитель окна. Заметьте, что это не родительско-дочерние
;отношения в окна MDI (multiрly document interface). Дочерние окна не ограничены
;границами клиентской области родительского окна. Эти отношения нужны для
;внутреннего использования Windows. Если родительское окно уничтожено, все
;дочерние окна уничтожаются автоматически. Это действительно просто. Так как в
;нашем примере всего лишь одно окно, мы устанавливаем этот параметр в NULL
push rsi ;X-координата верхнего левого угла окна.
;Обычно эти значения равны CW_USEDEFAULT, что позволяет Windows решить, куда
;поместить окно. nWidth, nHeight: Ширина и высота окна . Вы можете также использовать
;CW_USEDEFAULT, чтобы позволить Windows выбрать соответствующую ширину и высоту
;для вас
push rsi ;Y-координата верхнего левого угла окна
push rsi ;ширина окна в пикселях
push rsi ;высота окна в пикселях
sub esp,20h
invoke CreateWindowEx,0,\;dwExStyle: Дополнительные стили окна
edi,\;lpClassName: Адрес ASCIIZ строки, содержащей имя класса окна
edi,\;lpWindowName: Адрес ASCIIZ строки, содержащей имя окна
WS_OVERLAPPEDWINDOW or WS_VISIBLE;dwStyle: Стили окна. Вы можете
;определить появление окна здесь. Можно передать NULL без проблем, тогда у окна
;не будет кнопок изменения размеров, закрытия и системного меню. Большого прока
;от этого окна нет. Самый общий стиль - это WS_OVERLAPPEDWINDOW. Стиль окна всегда
;лишь битовый флаг, поэтому вы можете комбинировать различные стили окна с помощью
;оператора "or", чтобы получить желаемый результат. Стиль WS_OVERLAPPEDWINDOW в
;действительности комбинация большинства общих стилей с помощью этого метода.
;цикл обработки сообщений
lea edi,msg
@@: invoke GetMessage,edi,NULL,0,0
invoke DispatchMessage,edi
jmp @b
WinMain endp
;----------------------+
; the window procedure |
;----------------------+
WndProc:cmp edx,WM_DESTROY
je wmDESTROY
jmp DefWindowProc;все сообщения, не обрабатываемые в функции
;WndProc, направляются на обработку по умолчанию
wmDESTROY: invoke ExitProcess,NULL; выходим из программы
.data
ClassName db "Win64 Iczelion's lesson #3a: Simple windows",0
end
@NulAsh

This comment has been minimized.

Copy link

commented Oct 25, 2018

Мой masm64 говорит, что нету такой инструкции pushaddr.

@alexeygritsenko

This comment has been minimized.

Copy link
Owner Author

commented Mar 10, 2019

Мой masm64 говорит, что нету такой инструкции pushaddr.

Только сейчас заметил ваш вопрос. Боюсь все подключения этого семпла находятся в win64a.inc. Попробуйте среду asm visual, там в комплекте все есть для сборки ассемблер программ.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
You can’t perform that action at this time.