Это руководство по основам FASM, показывающее примеры программ для Windows. Включает работу с WinAPI и базовые операции.
Простой пример программы, создающей окно и выводящей сообщение:
format PE console
entry start
include 'win32a.inc'
section '.data' data readable writeable
msg db 'Hello, World!', 0
section '.code' code readable executable
start:
; Регистрация класса окна
mov eax, [wc]
call [RegisterClass]
; Создание окна
mov eax, [CreateWindowEx]
call [eax]
; Сообщение окна
mov eax, [GetMessage]
call [eax]
; Отображение окна
mov eax, [ShowWindow]
call [eax]
; Входное сообщение
mov eax, [DispatchMessage]
call [eax]
; Завершение работы
mov eax, [ExitProcess]
call [eax]
section '.idata' data readable
library kernel32, 'kernel32.dll',\
user32, 'user32.dll'
import kernel32, ExitProcess, 'ExitProcess',\
GetMessage, 'GetMessageA',\
DispatchMessage, 'DispatchMessageA'
import user32, RegisterClass, 'RegisterClassA',\
CreateWindowEx, 'CreateWindowExA',\
ShowWindow, 'ShowWindow'
section '.rdata' readable
wc WNDCLASSEX
wc.cbSize dd sizeof.WNDCLASSEX
wc.style dd CS_HREDRAW or CS_VREDRAW
wc.lpfnWndProc dd WndProc
wc.hInstance dd [HINSTANCE]
wc.hCursor dd [LoadCursor]
wc.lpszClassName dd 'MyClass'
wc.hIcon dd 0
wc.hbrBackground dd COLOR_WINDOW + 1
; Функция окна
WndProc:
cmp [WM_DESTROY], eax
je destroy_window
; Вызов стандартного обработчика сообщений
call [DefWindowProc]
ret
destroy_window:
call [PostQuitMessage]
ret
Пример вызова функции WinAPI для создания окна и обработки сообщений:
format PE console
entry start
include 'win32a.inc'
section '.data' data readable writeable
msg db 'Message from WinAPI function', 0
section '.code' code readable executable
start:
; Регистрация класса окна
mov eax, [wc]
call [RegisterClass]
; Создание окна
mov eax, [CreateWindowEx]
call [eax]
; Сообщение окна
mov eax, [GetMessage]
call [eax]
; Отображение окна
mov eax, [ShowWindow]
call [eax]
; Входное сообщение
mov eax, [DispatchMessage]
call [eax]
; Завершение работы
mov eax, [ExitProcess]
call [eax]
section '.idata' data readable
library kernel32, 'kernel32.dll',\
user32, 'user32.dll'
import kernel32, ExitProcess, 'ExitProcess',\
GetMessage, 'GetMessageA',\
DispatchMessage, 'DispatchMessageA'
import user32, RegisterClass, 'RegisterClassA',\
CreateWindowEx, 'CreateWindowExA',\
ShowWindow, 'ShowWindow'
section '.rdata' readable
wc WNDCLASSEX
wc.cbSize dd sizeof.WNDCLASSEX
wc.style dd CS_HREDRAW or CS_VREDRAW
wc.lpfnWndProc dd WndProc
wc.hInstance dd [HINSTANCE]
wc.hCursor dd [LoadCursor]
wc.lpszClassName dd 'MyClass'
wc.hIcon dd 0
wc.hbrBackground dd COLOR_WINDOW + 1
; Функция окна
WndProc:
cmp [WM_DESTROY], eax
je destroy_window
; Вызов стандартного обработчика сообщений
call [DefWindowProc]
ret
destroy_window:
call [PostQuitMessage]
ret
Пример обработки сообщений окна:
format PE console
entry start
include 'win32a.inc'
section '.data' data readable writeable
msg db 'Message', 0
section '.code' code readable executable
start:
; Регистрация класса окна
mov eax, [wc]
call [RegisterClass]
; Создание окна
mov eax, [CreateWindowEx]
call [eax]
; Сообщение окна
mov eax, [GetMessage]
call [eax]
; Отображение окна
mov eax, [ShowWindow]
call [eax]
; Входное сообщение
mov eax, [DispatchMessage]
call [eax]
; Завершение работы
mov eax, [ExitProcess]
call [eax]
section '.idata' data readable
library kernel32, 'kernel32.dll',\
user32, 'user32.dll'
import kernel32, ExitProcess, 'ExitProcess',\
GetMessage, 'GetMessageA',\
DispatchMessage, 'DispatchMessageA'
import user32, RegisterClass, 'RegisterClassA',\
CreateWindowEx, 'CreateWindowExA',\
ShowWindow, 'ShowWindow'
section '.rdata' readable
wc WNDCLASSEX
wc.cbSize dd sizeof.WNDCLASSEX
wc.style dd CS_HREDRAW or CS_VREDRAW
wc.lpfnWndProc dd WndProc
wc.hInstance dd [HINSTANCE]
wc.hCursor dd [LoadCursor]
wc.lpszClassName dd 'MyClass'
wc.hIcon dd 0
wc.hbrBackground dd COLOR_WINDOW + 1
; Функция окна
WndProc:
cmp [WM_DESTROY], eax
je destroy_window
; Вызов стандартного обработчика сообщений
call [DefWindowProc]
ret
destroy_window:
call [PostQuitMessage]
ret