⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 sample.asm

📁 windows下汇编语言 学习汇编语言好助手
💻 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 + -