📄 sample.asm
字号:
;***************************
;文件:Sample.asm *
;功能:用Masm写Win32程序的 *
; 简单例子 *
;***************************
.386
.model flat, stdcall
option casemap :none
include c:\masm32\include\windows.inc ;头文件
include c:\masm32\include\gdi32.inc
include c:\masm32\include\user32.inc
include c:\masm32\include\kernel32.inc
includelib c:\masm32\lib\gdi32.lib ;库文件
includelib c:\masm32\lib\user32.lib
includelib c:\masm32\lib\kernel32.lib
szText MACRO Name, Text:VARARG ;宏定义
LOCAL lbl
jmp lbl
Name db Text,0
lbl:
ENDM
IDM_MAINMENU= 600 ;常量定义
IDM_EXIT = 601
IDM_ABOUT = 602
IDI_MYICON = 700
IDD_ABOUT = 1000
WinMain PROTO :DWORD,:DWORD,:DWORD,:DWORD ;函数原型
WndProc PROTO :DWORD,:DWORD,:DWORD,:DWORD
AboutDlgProc PROTO :DWORD,:DWORD,:DWORD,:DWORD
.DATA ;数据
hInstance dd 0
CommandLine dd 0
.CODE ;代码
start:
invoke GetModuleHandle, NULL ;取模块句柄
mov hInstance, eax
invoke GetCommandLine ;取命令行
mov CommandLine, eax
invoke WinMain,hInstance,NULL,CommandLine,SW_SHOWDEFAULT
invoke ExitProcess,eax ;退出进程
;**************************************************************
;WinMain函数
WinMain PROC hInst:DWORD, hPreInst:DWORD, szCmdLine:DWORD, nCmdShow:DWORD
LOCAL wc :WNDCLASSEX
LOCAL msg :MSG
LOCAL hMainWin :DWORD
szText szClassName,"my_win_class" ;窗口类名
szText szTitle, "Masm Sample" ;窗口标题
mov wc.cbSize, SIZEOF WNDCLASSEX
mov wc.style, CS_HREDRAW or CS_VREDRAW
mov wc.lpfnWndProc, OFFSET WndProc
mov wc.cbClsExtra, NULL
mov wc.cbWndExtra, NULL
mov eax, hInst
mov wc.hInstance, eax
invoke GetStockObject, WHITE_BRUSH
mov wc.hbrBackground, eax
mov wc.lpszMenuName, NULL
mov wc.lpszClassName, OFFSET szClassName
invoke LoadIcon,hInst, IDI_MYICON
mov wc.hIcon, eax
invoke LoadCursor,NULL,IDC_ARROW
mov wc.hCursor, eax
mov wc.hIconSm, 0
invoke RegisterClassEx,ADDR wc ;注册窗口类
invoke GetSystemMetrics,SM_CXSCREEN ;取屏幕宽
push eax
invoke GetSystemMetrics,SM_CYSCREEN ;取屏幕高
pop ebx
shr ebx,1 ;宽除以2
shr eax,1 ;高除以2
invoke CreateWindowEx,0, ;建立主窗口
ADDR szClassName,
ADDR szTitle,
WS_OVERLAPPEDWINDOW,
CW_USEDEFAULT, CW_USEDEFAULT,
ebx,eax,
NULL,NULL,
hInst,NULL
mov hMainWin,eax ;窗口句柄
invoke ShowWindow,hMainWin,SW_SHOWNORMAL
invoke UpdateWindow,hMainWin
MsgLoop: ;消息循环
invoke GetMessage,ADDR msg,NULL,0,0
or eax,eax
jz Exit
invoke TranslateMessage, ADDR msg
invoke DispatchMessage, ADDR msg
jmp MsgLoop
Exit:
mov eax,msg.wParam
ret
WinMain ENDP
;**************************************************************
;主窗口过程
WndProc PROC hWnd:DWORD, wMsg:DWORD, wParam:DWORD, lParam:DWORD
.if wMsg == WM_COMMAND
.if wParam == IDM_EXIT ;用户选择菜单项“退出”
invoke SendMessage,hWnd,WM_SYSCOMMAND,SC_CLOSE,NULL
.elseif wParam == IDM_ABOUT ;用户选择菜单项“关于”
invoke DialogBoxParamA,hInstance,IDD_ABOUT,hWnd,OFFSET AboutDlgProc,0
.endif
.elseif wMsg == WM_CREATE
invoke LoadMenu,hInstance,IDM_MAINMENU
invoke SetMenu,hWnd,eax
.elseif wMsg == WM_DESTROY
invoke PostQuitMessage,NULL
xor eax,eax
ret
.endif
invoke DefWindowProc,hWnd,wMsg,wParam,lParam
ret
WndProc ENDP
;**************************************************************
;“关于”对话框处理过程
AboutDlgProc PROC hWnd:DWORD, wMsg:DWORD, wParam:DWORD, lParam:DWORD
.if wMsg == WM_COMMAND
.if wParam == IDOK
invoke EndDialog,hWnd,1
.endif
.elseif wMsg == WM_CLOSE
invoke EndDialog,hWnd,1
.endif
xor eax,eax
ret
AboutDlgProc ENDP
;**************************************************************
end start
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -