Полное руководство по основам FASM (Flat Assembler) для Windows

Это руководство по основам FASM, показывающее примеры программ для Windows. Включает работу с WinAPI и базовые операции.

Назад

Первая программа на FASM для Windows

Простой пример программы, создающей окно и выводящей сообщение:


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

Пример вызова функции 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