程式語言 - Netwide Assembler (NASM) - Win32 API - head.asm



[bits 32]
global _start
 
extern _Arc@36
extern _Pie@36
extern _sprintf
extern _Chord@36
extern _LineTo@12
extern _Polygon@12
extern _Ellipse@20
extern _EndPaint@8
extern _MoveToEx@16
extern _FillRect@12
extern _SetPixel@16
extern _TextOutA@20
extern _SetTimer@16
extern _KillTimer@8
extern _SetBkMode@8
extern _DrawTextA@20
extern _Rectangle@20
extern _CreatePen@12
extern _BeginPaint@8
extern _CreateFontA@56
extern _ExitProcess@4
extern _GetMessageA@16
extern _MessageBoxA@16
extern _SetTextColor@8
extern _DeleteObject@4
extern _SelectObject@8
extern _SetScrollPos@16
extern _DestroyWindow@4
extern _RegisterClassA@4
extern _DefWindowProcA@16
extern _SetScrollRange@20
extern _SetWindowTextA@8
extern _SetWindowLongA@12
extern _CallWindowProcA@20
extern _GetCommandLineA@0
extern _CreateWindowExA@48
extern _PostQuitMessage@4
extern _CreateSolidBrush@4
extern _GetModuleHandleA@4
extern _DispatchMessageA@4
 
%define ARG1 8h
%define ARG2 0ch
%define ARG3 10h
%define ARG4 14h

%define Arc                 _Arc@36
%define Pie                 _Pie@36
%define sprintf             _sprintf
%define Chord               _Chord@36
%define LineTo              _LineTo@12
%define TextOut             _TextOutA@20
%define Polygon             _Polygon@12
%define Ellipse             _Ellipse@20
%define EndPaint            _EndPaint@8
%define MoveToEx            _MoveToEx@16
%define FillRect            _FillRect@12
%define SetPixel            _SetPixel@16
%define SetTimer            _SetTimer@16
%define KillTimer           _KillTimer@8
%define DrawText            _DrawTextA@20
%define SetBkMode           _SetBkMode@8
%define Rectangle           _Rectangle@20
%define CreatePen           _CreatePen@12
%define BeginPaint          _BeginPaint@8
%define GetMessage          _GetMessageA@16
%define MessageBox          _MessageBoxA@16
%define CreateFont          _CreateFontA@56
%define ExitProcess         _ExitProcess@4
%define SetTextColor        _SetTextColor@8
%define DeleteObject        _DeleteObject@4
%define SelectObject        _SelectObject@8
%define SetScrollPos        _SetScrollPos@16
%define DestroyWindow       _DestroyWindow@4
%define RegisterClass       _RegisterClassA@4
%define DefWindowProc       _DefWindowProcA@16
%define SetScrollRange      _SetScrollRange@20
%define SetWindowText       _SetWindowTextA@8
%define SetWindowLong       _SetWindowLongA@12
%define CallWindowProc      _CallWindowProcA@20
%define GetCommandLine      _GetCommandLineA@0
%define CreateWindowEx      _CreateWindowExA@48
%define PostQuitMessage     _PostQuitMessage@4
%define CreateSolidBrush    _CreateSolidBrush@4
%define GetModuleHandle     _GetModuleHandleA@4
%define DispatchMessage     _DispatchMessageA@4
     
DT_VCENTER              equ 4h
DT_CENTER               equ 1h
DT_SINGLELINE           equ 20h
TRANSPARENT             equ 1
FF_DONTCARE             equ 0
FW_BOLD                 equ 700
OUT_OUTLINE_PRECIS      equ 8
CLIP_DEFAULT_PRECIS     equ 0
CLEARTYPE_QUALITY       equ 5
DEFAULT_PITCH           equ 0
PS_SOLID                equ 0
GWL_WNDPROC             equ -4
SB_LINEUP               equ 0
SB_LINELEFT             equ 0
SB_LINEDOWN             equ 1
SB_LINERIGHT            equ 1
SB_PAGEUP               equ 2
SB_PAGELEFT             equ 2
SB_PAGEDOWN             equ 3
SB_PAGERIGHT            equ 3
SB_VERT                 equ 1
SW_SHOWNORMAL           equ 1h
WC_DIALOG               equ 8002h
WM_PAINT                equ 0fh
WM_VSCROLL              equ 115h
WM_TIMER                equ 113h
WM_MOUSEMOVE            equ 200h
WM_SYSKEYDOWN           equ 104h
WM_KEYDOWN              equ 100h
WM_DESTROY              equ 2h
WM_CLOSE                equ 10h
WS_VSCROLL              equ 200000h
WS_OVERLAPPED           equ 0h
WS_CAPTION              equ 0c00000h
WS_SYSMENU              equ 80000h
WS_THICKFRAME           equ 40000h
WS_MINIMIZEBOX          equ 20000h
WS_MAXIMIZEBOX          equ 10000h
WS_VISIBLE              equ 10000000h
WS_EX_LEFT              equ 00000000h
WS_OVERLAPPEDWINDOW     equ WS_OVERLAPPED   | \
                            WS_CAPTION      | \
                            WS_SYSMENU      | \
                            WS_THICKFRAME   | \
                            WS_MINIMIZEBOX  | \
                            WS_MAXIMIZEBOX
false                   equ 0
                   
%macro CreateMyPen 2
    push %2
    push %1
    push PS_SOLID
    call CreatePen
%endmacro
     
%macro DrawMyLine 6
    push %2
    push %1
    call SelectObject
          
    push 0
    push %4
    push %3
    push %1
    call MoveToEx
          
    push %6
    push %5
    push %1
    call LineTo
%endmacro
     
struc RECT
    .left:   resd 1
    .top:    resd 1
    .right:  resd 1
    .bottom: resd 1
    .SIZE:
endstruc
         
struc PAINTSTRUCT
    .hdc:         resd 1
    .fErase:      resd 1
    .rcPaint:     resb RECT.SIZE
    .fRestore:    resd 1
    .fIncUpdate:  resd 1
    .rgbReserved: resb 32
    .SIZE:
endstruc
         
struc POINT
    .x: resd 1
    .y: resd 1
    .SIZE:
endstruc
               
struc MSG
    .hwnd:    resd 1
    .message: resd 1
    .wParam:  resd 1
    .lParam:  resd 1
    .time:    resd 1
    .pt:      resb POINT.SIZE
    .SIZE:
endstruc

struc WNDCLASS
    .style:         resd 1
    .lpfnWndProc:   resd 1
    .cbClsExtra:    resd 1
    .cbWndExtra:    resd 1
    .hInstance:     resd 1
    .hIcon:         resd 1
    .hCursor:       resd 1
    .hbrBackground: resd 1
    .lpszMenuName:  resd 1
    .lpszClassName: resd 1
    .SIZE:
endstruc

    section .drectve info
_entry      db "/entry:start "
_gdi32      db "/defaultlib:c:\\masm32\\lib\\gdi32.lib "
_user32     db "/defaultlib:c:\\masm32\\lib\\user32.lib "
_msvcrt     db "/defaultlib:c:\\masm32\\lib\\msvcrt.lib "
_kernel32   db "/defaultlib:c:\\masm32\\lib\\kernel32.lib "
                    
    segment .data
szAppName   db "main",0
szFont      db "Arial",0
szMsg       db "Test",0
MsgLen      equ ($ - szMsg) - 1
pBuf        times 255 db 0
FMT_KBD     db "Key: %d",0
FMT_MOUSE   db "%d-%d",0
FMT_TIMER   db "%d",0
SLUP        db "LINE++",0
SLDN        db "LINE--",0
SPUP        db "PAGE++",0
SPDN        db "PAGE--",0
hWin        dd 0
hInstance   dd 0
pDefWndProc dd 0
pCommand    dd 0
hDC         dd 0
hPen        dd 0
hBrush      dd 0
hFont       dd 0
dwCnt       dd 0
x           dd 0
y           dd 0
pt          times (POINT.SIZE * 3) db 0

msg istruc MSG
    at .hwnd,    dd 0
    at .message, dd 0
    at .wParam,  dd 0
    at .lParam,  dd 0
    at .time,    dd 0
    at .pt,      dd 0, 0
iend
                   
ps istruc PAINTSTRUCT
    at .hdc,         dd 0
    at .fErase,      dd 0
    at .rcPaint,     dd 0, 0, 0, 0
    at .fRestore,    dd 0
    at .fIncUpdate,  dd 0
    at .rgbReserved, db 0
iend             

wndClass istruc WNDCLASS
    at .style,         dd 0
    at .lpfnWndProc,   dd 0
    at .cbClsExtra,    dd 0
    at .cbWndExtra,    dd 0
    at .hInstance,     dd 0
    at .hIcon,         dd 0
    at .hCursor,       dd 0
    at .hbrBackground, dd 0
    at .lpszMenuName,  dd 0
    at .lpszClassName, dd 0
iend

struc用來定義Struct
istruc則是宣告資料(Instance)的意思,at用來指定初始化的資料內容,如果沒有想要做資料初始化,可以省略at