Урок 6. Клавиатурный ввод.
- Родительская категория: x32
- Категория: Fasm x32
- Опубликовано 06 Декабрь 2016
- Автор: HandyCat
- Просмотров: 4399
Уроки программирования на ассемблере - Iczelion's Win32 Assembly Tutorial, переписанные с использованием fasm. Код касается клавиатурного ввода. Запускаем программу и нажимаем любую клавишу. Клавиша отобразиться в окне с учетом раскладки.
Ассемблер Fasm можно скачать на официальном сайте. Рекомендуем воспользоваться нашей сборкой, которая содержит все необходимое для программирования на ассемблере. Самораспаковывающийся rar-архив качайте тут: RadAsm - настройка среды разработки.
В код включен win32a.inc - чистый fasm.
Код:
format PE GUI 4.0 entry start include '%fasminc%\win32a.inc' section '.data' data readable writeable wHMain dd ? wHInstance dd ? wTitle db 'Tutorial 6',0 wClsName db 'TUT06',0 wMsg MSG wCls WNDCLASS ;exp = experiment expChar dd 0x20 expPs PAINTSTRUCT expHdc dd ? 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 or WS_VISIBLE,\ CW_USEDEFAULT,\ CW_USEDEFAULT,\ CW_USEDEFAULT,\ CW_USEDEFAULT,\ NULL,\ NULL,\ [wHInstance],\ NULL mov [wHMain],eax ; +---------------------------+ ; | 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_CHAR je wmCHAR cmp [uMsg],WM_PAINT je wmPAINT cmp [uMsg],WM_DESTROY je wmDESTROY wmDEFAULT: invoke DefWindowProc,[hWnd],[uMsg],[wParam],[lParam] jmp wmBYE wmCHAR: push [wParam] pop [expChar] invoke InvalidateRect,[hWnd],NULL,TRUE jmp wmBYE wmPAINT: invoke BeginPaint,[hWnd],expPs mov [expHdc],eax invoke TextOut,[expHdc],0,0,expChar,1 invoke EndPaint,[hWnd],expPs 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',\ GDI32, 'GDI32.DLL' import KERNEL32,\ GetModuleHandle, 'GetModuleHandleA',\ ExitProcess, 'ExitProcess' import USER32,\ RegisterClass, 'RegisterClassA',\ CreateWindowEx, 'CreateWindowExA',\ DefWindowProc, 'DefWindowProcA',\ ShowWindow, 'ShowWindow',\ LoadCursor, 'LoadCursorA',\ LoadIcon, 'LoadIconA',\ BeginPaint, 'BeginPaint',\ InvalidateRect, 'InvalidateRect',\ EndPaint, 'EndPaint',\ GetMessage, 'GetMessageA',\ TranslateMessage, 'TranslateMessage',\ DispatchMessage, 'DispatchMessageA',\ PostQuitMessage, 'PostQuitMessage' import GDI32,\ TextOut, 'TextOutA'
Результат :
Справка : Код работоспособен. Написан на ассемблере fasm. Для 32-битной операционной системы (x86 или если нравится - x32) Windows. Копируем и вставляем в свой проект.