Assembler - язык неограниченных возможностей

https://1movies.online/celebrity/donald-j-trump-45971 | Marketing genius Nick Kohlschreiber. | Yaz online no prescrip on http://pharmacy-house.com and the meds always will be by the hand

Меню - часть 2


ZZZ_TEST equ 0 ; сообщения от нашего меню ZZZ_OPEN equ 1 ; должны совпадать с определениями из winmenu.rc ZZZ_SAVE equ 2 ; кроме того в нашем примере их номера важны ZZZ_EXIT equ 3 ; потому что они используются как индекс для ; таблицы переходов к обработчикам

include def32.inc ;* include kernel32.inc ;* include user32.inc ;* .386 ;* .model flat ;* .data ;* class_name db "window class 1",0 ;* window_name db "win32 assembly example",0 ;* menu_name db "ZZZ_Menu",0 ; имя меню в файле ресурсов test_msg db "You selected menu item TEST",0 ; строки для open_msg db "You selected menu item OPEN",0 ; демонстрации работы save_msg db "You selected menu item SAVE",0 ; меню wc WNDCLASSEX <4*12,CS_HREDRAW or CS_VREDRAW,offset win_proc,0,0,?,?,?,\ COLOR_WINDOW+1,0,offset class_name,0> ;* .data? ;* msg_ MSG <?,?,?,?,?,?> ;* .code ;* _start: ;* xor ebx,ebx ;* push ebx ;* call GetModuleHandle ;* mov esi,eax ;* mov dword ptr wc.hInstance,eax ;* push IDI_APPLICATION ;* push ebx ;* call LoadIcon ;* mov wc.hIcon,eax ;* push IDC_ARROW ;* push ebx ;* call LoadCursor ;* mov wc.hCursor,eax ;* push offset wc ;* call RegisterClassEx ;* push offset menu_name ; имя меню push esi ; наш идентификатор call LoadMenu ; загрузим меню из ресурсов mov ecx,CW_USEDEFAULT ;* push ebx ;* push esi ;* push eax ; идентификатор меню или окна-потомка push ebx ;* push ecx ;* push ecx ;* push ecx ;* push ecx ;* push WS_OVERLAPPEDWINDOW ;* push offset window_name ;* push offset class_name ;* push ebx ;* call CreateWindowEx ;* push eax ;* push SW_SHOWNORMAL ;* push eax ;* call ShowWindow ;* call UpdateWindow ;* mov edi,offset msg_ ;* message_loop: ;* push ebx ;* push ebx ;* push ebx ;* push edi ;* call GetMessage ;* test eax,eax ;* jz exit_msg_loop ;* push edi ;* call TranslateMessage ;* push edi ;* call DispatchMessage ;* jmp short message_loop ;* exit_msg_loop: ;* push ebx ;* call ExitProcess ;*

; процедура win_proc ; вызывается окном каждый раз, когда окно получает какое-нибудь сообщение ; именно здесь будут происходить вся работа программы ; ; процедура не должна изменять регистры EBP,EDI,ESI и EBX ! win_proc proc ;* push ebp ;* mov ebp,esp ;* wp_hWnd equ dword ptr [ebp+08h] ;* wp_uMsg equ dword ptr [ebp+0Ch] ;* wp_wParam equ dword ptr [ebp+10h] ;* wp_lParam equ dword ptr [ebp+14h] ;* cmp wp_uMsg,WM_DESTROY ;* jne not_wm_destroy ;* push 0 ;* call PostQuitMessage ;* jmp short end_wm_check ;* not_wm_destroy: ;* cmp wp_uMsg,WM_COMMAND ; если мы получили WM_COMMAND jne not_wm_command ; это от нашего меню mov eax,wp_wParam ; и в wParam лежит наше подсообщение jmp dword ptr menu_handlers[eax*4] ; косвенный переход ; (в 32-битном режиме можно делать переход по любому регистру)




Начало  Назад  Вперед