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 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