📄 asmwin.asm
字号:
LOCALS
.MODEL LARGE, WINDOWS PASCAL
.286
INCLUDE WINDOWS.INC
extrn INITTASK:PROC
extrn WAITEVENT:PROC
extrn INITAPP:PROC
extrn REGISTERCLASS:PROC
extrn MESSAGEBOX:PROC
extrn GETSTOCKOBJECT:PROC
extrn LOADCURSOR:PROC
extrn CREATEWINDOW:PROC
extrn SHOWWINDOW:PROC
extrn UPDATEWINDOW:PROC
extrn GETMESSAGE:PROC
extrn TRANSLATEMESSAGE:PROC
extrn DISPATCHMESSAGE:PROC
extrn POSTQUITMESSAGE:PROC
extrn DEFWINDOWPROC:PROC
extrn BEGINPAINT:PROC
extrn ENDPAINT:PROC
extrn INVALIDATERECT:PROC
extrn TEXTOUT:PROC
.DATA
db 16 dup( 0 ) ; Required for Task Header!!
psp dw ?
pszCmdline dw ?
hPrev dw ?
hInstance dw ?
nCmdShow dw ?
hdc dw ?
hwndMain dw 0
ps PAINTSTRUCT <0>
msg MSGSTRUCT <0>
wc WNDCLASS <0>
szTitleName db 'Sample Windows App',0
szClassName db "$un$Peu$d'Assemblage$",0
szSalute db 'Welcome to Windows from Assembly: Press LButton'
szSaluteEnd LABEL byte ; Not NULL terminated !!
szLButtonDown db 'Left Button down',0
szInfo db 'Info',0
.CODE
;=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=;
InitApplication PROC
;; initialize the WndClass structure
mov wc.clsStyle, CS_HREDRAW+CS_VREDRAW
mov word ptr wc.clsLpfnWndProc, OFFSET WndProc
mov word ptr wc.clsLpfnWndProc+2, SEG WndProc
mov wc.clsCbClsExtra, 0
mov wc.clsCbWndExtra, 0
mov ax, hInstance
mov wc.clsHInstance, ax
mov wc.clsHIcon, 0
xor ax, ax
call LoadCursor PASCAL, ax, ax, IDI_APPLICATION
mov wc.clsHCursor, ax
call GetStockObject PASCAL, WHITE_BRUSH
mov wc.clsHbrBackground, ax
mov word ptr wc.clsLpszMenuName, 0
mov word ptr wc.clsLpszMenuName+2, 0
mov word ptr wc.clsLpszClassName, OFFSET szClassName
mov word ptr wc.clsLpszClassName+2, ds
call RegisterClass PASCAL, DS, OFFSET wc
ret
ENDP
;=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=;
Start:
;Windows initialization. Sets up registers and stack.
;INITTASK returns:
; 'Failure:
; AX = zero if it failed
; Success:
; AX = 1
; CX = stack limit
; DX = cmdShow parameter to CreateWindow
; ES:BX = -> DOS format command line (ES = PSP address)
; SI = hPrevinstance
; DI = hinstance
call INITTASK
or ax,ax
jnz @@OK
jmp @@Fail
@@OK: mov psp, es
mov word ptr pszCmdline, bx
mov hPrev, si
mov hInstance, di
mov nCmdShow, dx
;Initialize the Windows App
xor ax,ax
call WAITEVENT PASCAL, ax
call INITAPP PASCAL, hInstance
or ax,ax
jnz @@InitOK
@@Fail: mov ax, 4CFFh
int 21h ; terminate program
@@InitOK: cmp hPrev, 0
jne @@RegOK
call InitApplication
or ax, ax
jz @@Fail
@@RegOK: xor ax, ax
mov bx, CW_USEDEFAULT
call CreateWindow PASCAL, DS OFFSET szClassName, DS,\
OFFSET szTitleName, \
WS_OVERLAPPEDWINDOW+WS_VISIBLE, ax, \
bx, bx, bx, bx, ax, ax, hInstance, ax, ax
mov hwndMain, ax
call ShowWindow PASCAL, ax, nCmdShow
call UpdateWindow PASCAL, hwndMain
@@MsgLoop: call GetMessage PASCAL, DS, OFFSET msg, 0, 0, 0
or ax, ax
jz @@End
call TranslateMessage PASCAL, DS, OFFSET msg
call DispatchMessage PASCAL, DS, OFFSET msg
jmp @@MsgLoop
@@End: mov ax, msg.msWPARAM
mov ah, 4Ch
int 21h
;=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=;
.DATA
MSGINFO STRUC
MsgValue dw 0
MsgHandler dw 0
MSGINFO ENDS
.CODE
;=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=;
PaintHandler PROC PASCAL NEAR hwnd:WORD, wParam:WORD, lParam:DWORD
call BeginPaint PASCAL, hwnd, DS, OFFSET ps
mov hdc, ax
mov bx, 10
mov cx, OFFSET szSaluteEnd
sub cx, OFFSET szSalute
call TextOut PASCAL, hdc, bx, bx, DS, OFFSET szSalute, cx
call EndPaint PASCAL, hwnd, DS, OFFSET ps
ret
ENDP
;=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=;
LButtonDownHandler PROC PASCAL NEAR hwnd:WORD, wParam:WORD, lParam:DWORD
call MessageBox PASCAL, hwnd, DS, OFFSET szLButtonDown, \
DS, OFFSET szInfo, MB_OK
ret
ENDP
;=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=;
DestroyHandler PROC PASCAL NEAR hwnd:WORD, wParam:WORD, lParam:DWORD
call PostQuitMessage PASCAL, 0
ret
ENDP
.DATA
;=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=;
MessageTableHandler LABEL MSGINFO
MSGINFO <WM_PAINT, OFFSET PaintHandler>
MSGINFO <WM_DESTROY,OFFSET DestroyHandler>
MSGINFO <WM_LBUTTONDOWN, OFFSET LButtonDownHandler>
MSGINFO <0,0> ;Flags end of table
.CODE
;=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=;
WndProc PROC WINDOWS PASCAL FAR hwnd:WORD, winMsg:WORD, \
wParam:WORD, lParam:DWORD
USES si
mov si, OFFSET MessageTableHandler
@@LookUp: mov ax, [si.MsgValue]
or ax, ax
jz @@Def
cmp ax, winMsg
je @@Dispatch
add si, SIZE MsgInfo
jmp @@LookUp
@@Dispatch: call [si.MsgHandler] PASCAL, hwnd, wParam, lParam
mov ax, 0
mov dx, 0
ret
@@Def: call DefWindowProc PASCAL, hwnd, winMsg, wParam, lParam
ret
WndProc ENDP
PUBLICDLL WndProc
END Start
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -