Created
January 1, 2018 17:57
-
-
Save alexeygritsenko/8ef376d3f588f43582059a435bbb76ce to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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 |
Мой masm64 говорит, что нету такой инструкции pushaddr.
Только сейчас заметил ваш вопрос. Боюсь все подключения этого семпла находятся в win64a.inc. Попробуйте среду asm visual, там в комплекте все есть для сборки ассемблер программ.
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Мой masm64 говорит, что нету такой инструкции pushaddr.