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

📄 win32asm.txt

📁 win32ASM教程
💻 TXT
📖 第 1 页 / 共 3 页
字号:
#define _APS_NEXT_SYMED_VALUE           101#endif#endif本程序与一般Win32编程资料中的GENERIC程序基本相同,只是只使用ANSI字符集。现在笔者用Win32汇编语言程序实现本程序的功能,程序如下:包含文件(GENERIC.INC):UINT		TYPEDEF		DWORDLONG		TYPEDEF		DWORDLPSTR		TYPEDEF		PTR BYTELPCSTR		TYPEDEF		LPSTRPVOID		TYPEDEF		PTRLPVOID		TYPEDEF		PVOIDHANDLE		TYPEDEF		PVOIDHINSTANCE	TYPEDEF		HANDLEHWND		TYPEDEF		HANDLEHMENU		TYPEDEF		HANDLEHDC		TYPEDEF		HANDLEHGDIOBJ		TYPEDEF		HANDLEHICON		TYPEDEF		HANDLEHCURSOR		TYPEDEF		HANDLEHBRUSH		TYPEDEF		HANDLEtagWNDCLASSEXA	STRUCT	cbSize		UINT		?	style		UINT		?	lpfnWndProc	DWORD		?	cbClsExtra	DWORD		?	cbWndExtra	DWORD		?	hInstance	DWORD		?	hIcon		DWORD		?	hCursor		DWORD		?	hbrBackground	DWORD		?	lpszMenuName	DWORD		?	lpszClassName	DWORD		?	hIconSm		DWORD		?tagWNDCLASSEXA	ENDSWNDCLASSEXA	TYPEDEF		tagWNDCLASSEXAtagPOINT	STRUCT	x		LONG		?	y		LONG		?tagPOINT	ENDSPOINT		TYPEDEF		tagPOINTtagMSG		STRUCT	message		UINT		?	wParam		DWORD		?	lParam		DWORD		?	time		DWORD		?	pt		POINT		<>tagMSG		ENDSMSG		TYPEDEF		tagMSGLPMSG		TYPEDEF		PTR MSGtagRECT		STRUCT	left		LONG		?	top		LONG		?	right		LONG		?	bottom		LONG		?tagRECT		ENDSRECT		TYPEDEF		tagRECTtagPAINTSTRUCT	STRUCT	hdc		DWORD		?	fErase		DWORD		?	rcPaint		RECT		<>	fRestore	DWORD		?	fIncUpdate	DWORD		?	rgbReserved	BYTE		32 DUP(?)tagPAINTSTRUCT	ENDSPAINTSTRUCT	TYPEDEF		tagPAINTSTRUCTLPPAINTSTRUCT	TYPEDEF		PTR PAINTSTRUCTNULL			=		0TRUE			=		0ffffffffhFALSE			=		0SW_SHOWDEFAULT		=		10CS_HREDRAW		=		0002hCS_VREDRAW		=		0001hIDI_APPLICATION		=		32512IDC_ARROW		=		32512COLOR_WINDOW		=		5WS_OVERLAPPEDWINDOW	=		00cf0000hCW_USEDEFAULT		=		80000000hWM_COMMAND		=		0111hWM_CLOSE		=		0010hWM_PAINT		=		000fhWM_DESTROY		=		0002hWM_INITDIALOG		=		0110hIDOK			=		1IDCANCEL		=		2GetModuleHandleA	PROTO stdcall,	:LPCSTRGetCommandLineA		PROTO stdcallExitProcess		PROTO stdcall,	:UINTLoadIconA		PROTO stdcall,	:HINSTANCE,:LPCSTRLoadCursorA		PROTO stdcall,	:HINSTANCE,:LPCSTRRegisterClassExA	PROTO stdcall,	:PTR WNDCLASSEXACreateWindowExA		PROTO stdcall,	:DWORD,:LPCSTR,:LPCSTR,:DWORD,:DWORD,:DWORD,:DWORD,:DWORD,:HWND,:HMENU,:HINSTANCE,:LPVOIDShowWindow		PROTO stdcall,	:HWND,:DWORDUpdateWindow		PROTO stdcall,	:HWNDGetMessageA		PROTO stdcall,	:LPMSG,:HWND,:UINT,:UINTTranslateMessage	PROTO stdcall,	:PTR MSGDispatchMessageA	PROTO stdcall,	:PTR MSGSendMessageA		PROTO stdcall,	:HWND,:UINT,:DWORD,:DWORDDialogBoxParamA		PROTO stdcall,	:HINSTANCE,:LPCSTR,:HWND,:DWORD,:DWORDBeginPaint		PROTO stdcall,	:HWND,:LPPAINTSTRUCTEndPaint		PROTO stdcall,	:HWND,:PTR PAINTSTRUCTPostQuitMessage		PROTO stdcall,	:DWORDDefWindowProcA		PROTO stdcall,	:HWND,:UINT,:DWORD,:DWORDEndDialog		PROTO stdcall,	:HWND,:DWORD资源包含文件(RESOURCE.INC):IDR_MAINMENU		=		101IDD_ABOUT		=		102IDC_STATIC1		=		1000IDM_EXIT		=		40001IDM_ABOUT		=		40002源程序(GENERIC.ASM):.386p.MODEL flat,stdcallINCLUDE GENERIC.INCINCLUDE RESOURCE.INCWinMain			PROTO stdcall,	:HINSTANCE,:HINSTANCE,:LPSTR,:DWORD.STACK 4096.DATA	WindowClass	BYTE		'GENERIC',0	WindowTitle	BYTE		'Generic',0	hInst1		HINSTANCE	0	lpCmdLine1	LPSTR		0	.CODE_start:	INVOKE	GetModuleHandleA,NULL	mov	hInst1,eax	INVOKE	GetCommandLineA	mov	lpCmdLine1,eax	INVOKE	WinMain,hInst1,NULL,lpCmdLine1,SW_SHOWDEFAULT	INVOKE	ExitProcess,eax		WinMain	PROC	hInst:HINSTANCE,hPrevInst:HINSTANCE,lpCmdLine:LPSTR,nShowCmd:DWORD	LOCAL	wcex:WNDCLASSEXA	LOCAL	hWnd:HWND	LOCAL	msg:MSG	.IF	!hPrevInst		mov	wcex.cbSize,SIZEOF WNDCLASSEXA		mov	wcex.style,CS_HREDRAW or CS_VREDRAW		mov	wcex.cbClsExtra,0		mov	wcex.cbWndExtra,0		mov	wcex.lpfnWndProc,OFFSET WndProc		mov	eax,hInst		mov	wcex.hInstance,eax		INVOKE	LoadIconA,hInst,IDI_APPLICATION		mov	wcex.hIcon,eax		INVOKE	LoadCursorA,0,IDC_ARROW		mov	wcex.hCursor,eax		mov	wcex.hbrBackground,COLOR_WINDOW+1		mov	wcex.lpszMenuName,IDR_MAINMENU and 0000ffffh		mov	wcex.lpszClassName,OFFSET WindowClass		INVOKE	LoadIconA,hInst,IDI_APPLICATION		mov	wcex.hIconSm,eax		INVOKE	RegisterClassExA,ADDR wcex		.IF	!eax			mov	eax,FALSE			ret		.ENDIF	.ENDIF	INVOKE	CreateWindowExA,0,ADDR WindowClass,ADDR WindowTitle,WS_OVERLAPPEDWINDOW,CW_USEDEFAULT,CW_USEDEFAULT,CW_USEDEFAULT,CW_USEDEFAULT,0,0,hInst,NULL	mov	hWnd,eax	.IF	!eax		mov	eax,FALSE		ret	.ENDIF	INVOKE	ShowWindow,hWnd,nShowCmd	INVOKE	UpdateWindow,hWnd	.WHILE	TRUE		INVOKE	GetMessageA,ADDR msg,0,0,0		.BREAK	.IF	!eax		INVOKE	TranslateMessage,ADDR msg		INVOKE	DispatchMessageA,ADDR msg	.ENDW	mov	eax,msg.wParam	retWinMain ENDPWndProc	PROC	hWnd:HWND,message:UINT,wParam:DWORD,lParam:DWORD	LOCAL	hDC:HDC	LOCAL	ps:PAINTSTRUCT	.IF	message==WM_COMMAND		mov	eax,wParam		.IF	ax==IDM_EXIT			INVOKE	SendMessageA,hWnd,WM_CLOSE,0,0			mov	eax,0			ret		.ELSEIF	ax==IDM_ABOUT			mov	ebx,OFFSET AboutDlgProc			INVOKE	DialogBoxParamA,hInst1,IDD_ABOUT and 0000ffffh,hWnd,ebx,0			mov	eax,0			ret		.ELSE			INVOKE	DefWindowProcA,hWnd,message,wParam,lParam			ret		.ENDIF	.ELSEIF	message==WM_PAINT		INVOKE	BeginPaint,hWnd,ADDR ps		mov	hDC,eax		INVOKE	EndPaint,hWnd,ADDR ps		mov	eax,0		ret	.ELSEIF	message==WM_DESTROY		INVOKE	PostQuitMessage,0		mov	eax,0		ret	.ELSE		INVOKE	DefWindowProcA,hWnd,message,wParam,lParam		ret	.ENDIF	mov	eax,0ffffffffh	retWndProc ENDPAboutDlgProc	PROC	hDlg:HWND,message:UINT,wParam:DWORD,lParam:DWORD	.IF	message==WM_INITDIALOG		mov	eax,TRUE		ret	.ELSEIF	message==WM_COMMAND		mov	eax,wParam		.IF	(ax==IDOK)||(ax==IDCANCEL)			INVOKE	EndDialog,hDlg,ax			mov	eax,TRUE			ret		.ENDIF		mov	eax,FALSE		ret	.ELSE		mov	eax,FALSE		ret	.ENDIF	mov	eax,FALSE	retAboutDlgProc	ENDPPUBLIC _startEND汇编连接本程序的命令如下:ml /c /coff /Cp generic.asmrc generic.rclink /subsystem:windows /entry:_start generic.obj generic.res kernel32.lib user32.lib gdi32.lib运行汇编连接后生成的GENERIC.EXE文件,屏幕上将显示出一个带有菜单的窗口,窗口的标题是“Generic”,菜单有两个主菜单项,分别是“File”和“Help”,选择“File”菜单项下的“Exit”菜单项可以退出程序,选择“Help”菜单项下的“About”菜单项可以显示“About”对话框。本程序与SIMPLE.C程序很相似,Win32汇编语言程序中使用资源的方法也与C语言程序没有很大的差别,都可以用资源编辑工具生成资源源文件和资源头文件,然后使用资源编译器编译资源源文件,将生成的资源文件(RES文件)与汇编器生成的目标文件和引入库文件连接在一起就可以了(资源头文件需要移植到汇编语言上,建立一个资源包含文件)。C语言程序中的MAKEINTRESOURCE宏的实质是将资源标识符数值的高位字(不用)清零,然后强行转换成字符指针,Win32汇编语言程序中可以将资源标识符数值与0000FFFFH作AND运算。七、控制台Win32汇编语言程序学习过Win32SDK编程的读者一定知道控制台Win32应用程序,控制台Win32应用程序运行在控制台(MS-DOS窗口)下,与DOS下的C语言程序十分相似,程序入口点是main函数,使用标准C语言I/O函数进行I/O,也可以调用API。实际上控制台Win32应用程序与普通Win32应用程序没有本质上的区别,标准C语言I/O函数实际上还是调用了API,在控制台上进行I/O。控制台Win32汇编语言程序与C语言程序有一定的差别,需要获取控制台I/O句柄,然后使用控制台I/O句柄进行I/O(与文件句柄I/O相似),笔者以MASM 6.11中自带的控制台Win32汇编语言程序实例(HELLO.ASM)为例,程序如下:.386.MODEL flat, stdcallSTD_OUTPUT_HANDLE EQU -11GetStdHandle PROTO NEAR32 stdcall,    nStdHandle:DWORDWriteFile PROTO NEAR32 stdcall,    hFile:DWORD, lpBuffer:NEAR32, nNumberOfBytesToWrite:DWORD,    lpNumberOfBytesWritten:NEAR32, lpOverlapped:NEAR32ExitProcess PROTO NEAR32 stdcall,    dwExitCode:DWORD.STACK 4096.DATAmsg DB "Hello, world.", 13, 10written DD 0hStdOut DD 0.CODE_start:    INVOKE  GetStdHandle,        STD_OUTPUT_HANDLE      ; Standard output handle    mov hStdOut, eax    INVOKE  WriteFile,        hStdOut,               ; File handle for screen        NEAR32 PTR msg,        ; Address of string        LENGTHOF msg,          ; Length of string        NEAR32 PTR written,    ; Bytes written        0                      ; Overlapped mode    INVOKE  ExitProcess,        0                      ; Result code for parent processPUBLIC _startEND汇编连接本程序的命令如下:ml /c /coff /Cp hello.asmlink /subsystem:console /entry:_start hello.obj kernel32.lib连接命令中/subsystem:console选项表示连接器生成控制台Win32应用程序。在MS-DOS窗口(控制台)下运行汇编连接后生成的HELLO.EXE文件,将会像MS-DOS程序一样显示出“Hello, world.”字符串。本程序调用了GetStdHandle函数获取标准控制台输出设备句柄,然后调用WriteFile函数向标准控制台输出设备句柄写字符串,完成控制台字符串输出,最后调用了ExitProcess函数终止程序的执行。八、结束语本教程读者阅读到这里,可能会莞尔一笑,原来Win32汇编语言也不过就是这么回事呀,确实,MASM 6.0以上版本的汇编器提供的结构化汇编语言伪指令大大简化了Win32汇编语言编程。汇编语言确实比较复杂,但是Win32汇编语言对某些特殊方面有高级语言不可比拟的优点,如果你正在想编程清除Win32病毒(例如CIH病毒),或者你正在编写对速度要求较高的程序(例如大量计算的程序),不妨试试Win32汇编语言——或许正能够解决你的燃眉之急。本教程还简单介绍了Win32应用程序的执行机制,相信会对你探索Win32深层有一定的帮助。本教程所有的源程序已经整理打包,需要者可以直接与笔者联系,更欢迎与笔者交流经验,笔者的E-mail:kv_nt@hotmail.com。

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -