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

📄 win32asm.txt

📁 win32ASM教程
💻 TXT
📖 第 1 页 / 共 3 页
字号:
_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,NULL		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_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 ENDPPUBLIC _startEND汇编连接本程序的命令如下:ml /c /coff /Cp simple.asmlink /subsystem:windows /entry:_start simple.obj kernel32.lib user32.lib gdi32.lib运行汇编连接后生成的SIMPLE.EXE文件,屏幕上将显示出一个标准的窗口,窗口的标题是“SIMPLE”。学习过Win32SDK编程的读者都知道,Win32应用程序的入口点是WinMain函数,实际上WinMain函数是被C语言的初始化和结束代码调用的,Win32应用程序的真正入口点和DOS应用程序没有什么区别,都是在文件头中指定的应用程序起始点。Win32汇编语言没有C语言的初始化和结束代码,必须自己编写初始化和结束代码调用WinMain函数(过程),WinMain函数的原型是:int WINAPI WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,LPSTR lpCmdLine,int nShowCmd);WinMain函数有4个参数,分别是:hInstance——应用程序当前实例的句柄,可以通过调用GetModuleHandle函数获取。hPrevInstance——应用程序前一个实例的句柄,Win32中当前地址空间中不会有应用程序的其他实例在运行,该参数通常设置为NULL(提供该参数只是便于移植Win16应用程序源程序)。lpCmdLine——命令行参数,可以通过调用GetCommandLine函数获取。nShowCmd——主窗口的显示状态,可以设置成SW_SHOWDEFAULT(缺省状态)。本程序的初始化和结束代码如下:	INVOKE	GetModuleHandleA,NULL	mov	hInst1,eax	INVOKE	GetCommandLineA	mov	lpCmdLine1,eax	INVOKE	WinMain,hInst1,NULL,lpCmdLine1,SW_SHOWDEFAULT	INVOKE	ExitProcess,eax		Win32标准函数调用方式,函数返回值通过EAX寄存器返回。可见本程序的初始化和结束代码很简单,只是调用GetModuleHandle函数获取应用程序当前实例的句柄,调用GetCommandLine函数获取命令行参数,然后调用WinMain函数(过程),WinMain函数返回后调用ExitProcess函数终止程序的执行。将本程序与SIMPLE.C程序比较,可以看出程序结构十分相似,本程序大量使用了MASM 6.0以上版本的汇编器提供的结构化汇编语言伪指令,并不比C语言麻烦多少。六、资源在Win32汇编语言程序中的使用资源在Win32应用程序中是很重要的,笔者编写了一个使用资源的C语言程序,该程序实现了菜单和一个“About”对话框,程序如下:源程序(GENERIC.C):#include <windows.h>#include "resource.h"static HINSTANCE hInst;static char szWindowClass[]="GENERIC";LRESULT CALLBACK WndProc(HWND hWnd,UINT message,WPARAM wParam,LPARAM lParam);BOOL CALLBACK AboutDlgProc(HWND hDlg,UINT message,WPARAM wParam,LPARAM lParam);int WINAPI WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,LPSTR lpCmdLine,int nShowCmd){	WNDCLASSEXA wcex;	HWND hWnd;	MSG msg;	hInst=hInstance;	if(!hPrevInstance)	{		wcex.cbSize=sizeof(WNDCLASSEXA);		wcex.style=CS_HREDRAW|CS_VREDRAW;		wcex.cbClsExtra=0;		wcex.cbWndExtra=0;		wcex.lpfnWndProc=WndProc;		wcex.hInstance=hInstance;		wcex.hIcon=LoadIconA(hInstance,IDI_APPLICATION);		wcex.hCursor=LoadCursorA(0,IDC_ARROW);		wcex.hbrBackground=(HBRUSH)(COLOR_WINDOW+1);		wcex.lpszMenuName=MAKEINTRESOURCE(IDR_MAINMENU);		wcex.lpszClassName=szWindowClass;		wcex.hIconSm=LoadIconA(hInstance,IDI_APPLICATION);		if(!RegisterClassExA(&wcex)) return FALSE;	}	hWnd=CreateWindowExA(0,szWindowClass,"Generic",WS_OVERLAPPEDWINDOW,						 CW_USEDEFAULT,CW_USEDEFAULT,CW_USEDEFAULT,CW_USEDEFAULT,						 0,0,hInstance,NULL);	if(!hWnd) return FALSE;	ShowWindow(hWnd,nShowCmd);	UpdateWindow(hWnd);	while(GetMessageA(&msg,0,0,0))	{		TranslateMessage(&msg);		DispatchMessageA(&msg);	}	return msg.wParam;}LRESULT CALLBACK WndProc(HWND hWnd,UINT message,WPARAM wParam,LPARAM lParam){	HDC hDC;	PAINTSTRUCT ps;	switch(message)	{	case WM_COMMAND:		switch(LOWORD(wParam))		{		case IDM_EXIT:			SendMessageA(hWnd,WM_CLOSE,0,0);			return 0;		case IDM_ABOUT:			DialogBoxParamA(hInst,MAKEINTRESOURCE(IDD_ABOUT),hWnd,(DLGPROC)AboutDlgProc,0);			return 0;		default:			return DefWindowProcA(hWnd,message,wParam,lParam);		}	case WM_PAINT:		hDC=BeginPaint(hWnd,&ps);		EndPaint(hWnd,&ps);		return 0;	case WM_DESTROY:		PostQuitMessage(0);		return 0;	default:		return DefWindowProcA(hWnd,message,wParam,lParam);	}	return -1;}BOOL CALLBACK AboutDlgProc(HWND hDlg,UINT message,WPARAM wParam,LPARAM lParam){	switch(message)	{	case WM_INITDIALOG:		return TRUE;	case WM_COMMAND:		if((LOWORD(wParam)==IDOK)||(LOWORD(wParam)==IDCANCEL))		{			EndDialog(hDlg,LOWORD(wParam));			return TRUE;		}		return FALSE;	default:		return FALSE;	}}资源源文件(GENERIC.RC,使用Visual C++ 6.0建立)://Microsoft Developer Studio generated resource script.//#include "resource.h"#define APSTUDIO_READONLY_SYMBOLS///////////////////////////////////////////////////////////////////////////////// Generated from the TEXTINCLUDE 2 resource.//#include "afxres.h"/////////////////////////////////////////////////////////////////////////////#undef APSTUDIO_READONLY_SYMBOLS/////////////////////////////////////////////////////////////////////////////// Chinese (P.R.C.) resources#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_CHS)#ifdef _WIN32LANGUAGE LANG_CHINESE, SUBLANG_CHINESE_SIMPLIFIED#pragma code_page(936)#endif //_WIN32///////////////////////////////////////////////////////////////////////////////// Menu//IDR_MAINMENU MENU DISCARDABLE BEGIN    POPUP "&File"    BEGIN        MENUITEM "&Exit",                       IDM_EXIT    END    POPUP "&Help"    BEGIN        MENUITEM "&About...",                   IDM_ABOUT    ENDEND#ifdef APSTUDIO_INVOKED///////////////////////////////////////////////////////////////////////////////// TEXTINCLUDE//1 TEXTINCLUDE DISCARDABLE BEGIN    "resource.h\0"END2 TEXTINCLUDE DISCARDABLE BEGIN    "#include ""afxres.h""\r\n"    "\0"END3 TEXTINCLUDE DISCARDABLE BEGIN    "\r\n"    "\0"END#endif    // APSTUDIO_INVOKED///////////////////////////////////////////////////////////////////////////////// Dialog//IDD_ABOUT DIALOG DISCARDABLE  0, 0, 92, 65STYLE DS_MODALFRAME | DS_CENTER | WS_POPUP | WS_CAPTION | WS_SYSMENUCAPTION "About"FONT 9, "宋体"BEGIN    LTEXT           "Generic V1.0",IDC_STATIC1,20,10,50,10    DEFPUSHBUTTON   "OK",IDOK,20,40,50,15END///////////////////////////////////////////////////////////////////////////////// DESIGNINFO//#ifdef APSTUDIO_INVOKEDGUIDELINES DESIGNINFO DISCARDABLE BEGIN    IDD_ABOUT, DIALOG    BEGIN        LEFTMARGIN, 7        RIGHTMARGIN, 85        TOPMARGIN, 7        BOTTOMMARGIN, 58    ENDEND#endif    // APSTUDIO_INVOKED#endif    // Chinese (P.R.C.) resources/////////////////////////////////////////////////////////////////////////////#ifndef APSTUDIO_INVOKED///////////////////////////////////////////////////////////////////////////////// Generated from the TEXTINCLUDE 3 resource.///////////////////////////////////////////////////////////////////////////////#endif    // not APSTUDIO_INVOKED资源头文件(RESOURCE.H,Visual C++ 6.0自动建立)://{{NO_DEPENDENCIES}}// Microsoft Developer Studio generated include file.// Used by GENERIC.rc//#define IDR_MAINMENU                    101#define IDD_ABOUT                       102#define IDC_STATIC1                     1000#define IDM_EXIT                        40001#define IDM_ABOUT                       40002// Next default values for new objects// #ifdef APSTUDIO_INVOKED#ifndef APSTUDIO_READONLY_SYMBOLS#define _APS_NEXT_RESOURCE_VALUE        103#define _APS_NEXT_COMMAND_VALUE         40003#define _APS_NEXT_CONTROL_VALUE         1001

⌨️ 快捷键说明

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