Урок 3. Простое окно.
- Родительская категория: x32
- Категория: Fasm x32
- Опубликовано 29 Ноябрь 2016
- Автор: HandyCat
- Просмотров: 4128
Продолжаем выкладывать уроки программирования на ассемблере - Iczelion's Win32 Assembly Tutorial, переписанные с использованием fasm.
Ассемблер Fasm можно скачать на официальном сайте. Рекомендуем воспользоваться нашей сборкой, которая содержит все необходимое для программирования на ассемблере. Самораспаковывающийся rar-архив качайте тут: RadAsm - настройка среды разработки.
В код не включен win32ax.inc, вместо этого используется win32a.inc, что дает возможность писать на чистом fasm, делая невозможным написание кода в стиле masm32 (.if ... .endif и т.п.).
Код:
format PE GUI 4.0 entry start include '%fasminc%\win32a.inc' section '.data' data readable writeable wHMain dd ? wHInstance dd ? wTitle db 'Tutorial 3',0 ;name of our window wClsName db 'TUT03',0 ;name of our window class wMsg MSG wCls WNDCLASS section '.code' code readable executable start: ; +------------------------------+ ; | registering the window class | ; +------------------------------+ invoke GetModuleHandle,NULL mov [wHInstance],eax mov [wCls.hInstance],eax mov [wCls.style],CS_HREDRAW or CS_VREDRAW mov [wCls.lpfnWndProc],window_procedure mov [wCls.lpszClassName],wClsName mov [wCls.hbrBackground],COLOR_WINDOW+1 invoke LoadIcon,NULL,IDI_APPLICATION mov [wCls.hIcon],eax invoke LoadCursor,NULL,IDC_ARROW mov [wCls.hCursor],eax invoke RegisterClass,wCls ; +--------------------------+ ; | creating the main window | ; +--------------------------+ invoke CreateWindowEx,\ 0,\ wClsName,\ wTitle,\ WS_OVERLAPPEDWINDOW,\ CW_USEDEFAULT,\ CW_USEDEFAULT,\ CW_USEDEFAULT,\ CW_USEDEFAULT,\ NULL,\ NULL,\ [wHInstance],\ NULL mov [wHMain],eax invoke ShowWindow,[wHMain],SW_SHOW ; +---------------------------+ ; | entering the message loop | ; +---------------------------+ window_message_loop_start: invoke GetMessage,wMsg,NULL,0,0 or eax,eax je window_message_loop_end invoke TranslateMessage,wMsg invoke DispatchMessage,wMsg jmp window_message_loop_start window_message_loop_end: invoke ExitProcess,0 ; +----------------------+ ; | the window procedure | ; +----------------------+ proc window_procedure,hWnd,uMsg,wParam,lParam push ebx esi edi ;eventhough the API would preserved, but play safe :p cmp [uMsg],WM_DESTROY je wmDESTROY wmDEFAULT: invoke DefWindowProc,[hWnd],[uMsg],[wParam],[lParam] jmp wmBYE wmDESTROY: invoke PostQuitMessage,0 wmBYE: pop edi esi ebx ret endp section '.idata' import data readable writeable library KERNEL32, 'KERNEL32.DLL',\ USER32, 'USER32.DLL' import KERNEL32,\ GetModuleHandle, 'GetModuleHandleA',\ ExitProcess, 'ExitProcess' import USER32,\ RegisterClass, 'RegisterClassA',\ CreateWindowEx, 'CreateWindowExA',\ DefWindowProc, 'DefWindowProcA',\ ShowWindow, 'ShowWindow',\ LoadCursor, 'LoadCursorA',\ LoadIcon, 'LoadIconA',\ GetMessage, 'GetMessageA',\ TranslateMessage, 'TranslateMessage',\ DispatchMessage, 'DispatchMessageA',\ PostQuitMessage, 'PostQuitMessage'
Результат :
Справка : Код работоспособен. Ассемблер - fasm. Копируем и вставляем в свой проект.