W32匯編程序設(shè)計(jì)_第1頁(yè)
W32匯編程序設(shè)計(jì)_第2頁(yè)
W32匯編程序設(shè)計(jì)_第3頁(yè)
W32匯編程序設(shè)計(jì)_第4頁(yè)
W32匯編程序設(shè)計(jì)_第5頁(yè)
已閱讀5頁(yè),還剩21頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

1、Win32匯編語(yǔ)言教程作者:TBsoft- 一、引言Win32應(yīng)用程序一般使用C語(yǔ)言編程,但是在某些需要進(jìn)行深層編程的情況下,例如Win32應(yīng)用程序執(zhí)行機(jī)制分析、病毒清除、加密解密等深層編程,或者對(duì)于某些速度要求較高的程序,需要使用匯編語(yǔ)言(甚至機(jī)器語(yǔ)言)直接編寫Win32應(yīng)用程序。Win32應(yīng)用程序雖然和其他32位應(yīng)用程序(例如32位保護(hù)模式DOS程序)一樣可以使用386匯編語(yǔ)言和保護(hù)模式編程,但是Win32應(yīng)用程序的執(zhí)行機(jī)制與其他32位應(yīng)用程序有一定的差別,例如消息循環(huán)、動(dòng)態(tài)鏈接等,Win32匯編語(yǔ)言也有其特殊的編程方式。目前國(guó)內(nèi)極少看到有關(guān)Win32匯編語(yǔ)言的資料,市面上的匯編語(yǔ)言書籍一

2、般只介紹DOS實(shí)模式匯編語(yǔ)言和386保護(hù)模式匯編語(yǔ)言,金山公司的深入Windows編程一書雖然介紹了使用匯編語(yǔ)言寫Windows應(yīng)用程序的方法,可惜該書只介紹了Win16匯編語(yǔ)言。為了使大家能對(duì)Win32匯編語(yǔ)言的基本編程方法有一定的了解,近日得閑,筆者編寫了本教程,旨在拋磚引玉,如果本教程能夠帶領(lǐng)你走進(jìn)神秘的Win32匯編語(yǔ)言世界,筆者心愿足矣。使用本教程,要求讀者具有C語(yǔ)言編寫Win32應(yīng)用程序(Win32SDK編程)的基礎(chǔ)。二、進(jìn)行Win32匯編語(yǔ)言編程的基本軟件進(jìn)行Win32匯編語(yǔ)言編程,應(yīng)該準(zhǔn)備下列基本軟件:1、MASM 6.11以上版本的匯編器MASM是Microsoft公司的匯編

3、器,這是最基本的軟件,必需MASM 6.11以上版本才能夠匯編Win32匯編語(yǔ)言源程序。不過(guò)進(jìn)行Win32匯編語(yǔ)言編程不必要全套的MASM 6.11,只要一個(gè)ML.EXE文件就可以了,Windows 95 DDK中帶有MASM 6.11c的ML.EXE文件,Windows 98 DDK中帶有MASM 6.11d的ML.EXE文件,都可以使用。Turbo MASM 5.0(TASM)是Borland公司的匯編器,也可以用來(lái)匯編Win32匯編語(yǔ)言源程序,但是TASM的部分語(yǔ)法與MASM不同,用于MASM的Win32匯編語(yǔ)言源程序可能需要修改后才能用TASM匯編。本教程中的所有Win32匯編語(yǔ)言源程

4、序都基于MASM。2、Win32SDK進(jìn)行Win32匯編語(yǔ)言編程需要用到Win32SDK中的資源編譯器(RC.EXE)和連接器(LINK.EXE),還需要用到Win32SDK中的引入庫(kù)文件(KERNEL32.LIB、USER32.LIB、GDI32.LIB等)。如果沒(méi)有Win32SDK,Platform SDK也可以,還可以安裝Visual C+ 2.0以上版本的Visual C+,筆者使用的是Visual C+ 6.0。Borland C+ 4.0以上版本的Borland C+也可以使用,只是資源編譯器和連接器的文件名不同,分別是BRC.EXE(BRC32.EXE)和TLINK.EXE(TL

5、INK32.EXE),選項(xiàng)也不盡相同,另外Borland C+不支持COFF格式的OBJ文件,匯編時(shí)不能使用/coff選項(xiàng)。3、匯編語(yǔ)言編輯器一個(gè)普通的文本編輯器,用于編輯Win32匯編語(yǔ)言源程序。EDIT、PWB等都可以,Visual C+等編程語(yǔ)言中的編輯器也可以,甚至WORD、WPS 97等可以編輯文本文件的字處理軟件都可以,不過(guò)筆者推薦使用ASMEDIT,這是一個(gè)專用的匯編語(yǔ)言編輯器,效果非常好。Win32匯編語(yǔ)言一般使用命令行方式匯編連接,經(jīng)過(guò)一定的設(shè)置也可以在某些集成環(huán)境(PWB、Visual C+、ASMEDIT等)下匯編連接,還可以使用NMAKE工具,不過(guò)本教程中只使用命令行方

6、式匯編連接,也不使用NMAKE工具。三、ANSI字符集API與UNICODE字符集APIWin32 API中凡是與字符有關(guān)的API都有兩種不同的類型:ANSI字符集API和UNICODE字符集API,分別對(duì)應(yīng)ANSI字符和UNICODE字符,Windows NT支持兩種類型的API,Windows 9598只支持ANSI字符集API。在WINDOWS.H頭文件和其他Win32 API定義頭文件中,凡是與字符有關(guān)的API都有兩種不同的定義,ANSI字符集API以API名稱加字符“A”表示,UNICODE字符集API以API名稱加字符“W”表示,并使用條件編譯和宏定義實(shí)現(xiàn)自動(dòng)根據(jù)當(dāng)前字符集使用對(duì)應(yīng)

7、的API定義,例如GetModuleHandle函數(shù)的定義(包括在WINBASE.H頭文件中):WINBASEAPIHMODULEWINAPIGetModuleHandleA( LPCSTR lpModuleName );WINBASEAPIHMODULEWINAPIGetModuleHandleW( LPCWSTR lpModuleName );#ifdef UNICODE#define GetModuleHandle GetModuleHandleW#else#define GetModuleHandle GetModuleHandleA#endif / !UNICODE與字符有關(guān)的數(shù)據(jù)結(jié)

8、構(gòu)也有類似的定義。本教程考慮到匯編語(yǔ)言使用條件匯編會(huì)導(dǎo)致不太直觀,全部使用ANSI字符集API,這樣也可以保證在Windows 9598和Windows NT環(huán)境下的兼容性,所以本教程中許多API名稱和數(shù)據(jù)結(jié)構(gòu)的名稱都加有“A”字符,讀者可以方便地改用UNICODE字符集API。四、一個(gè)簡(jiǎn)單的Win32匯編語(yǔ)言程序讀者可能一聽到“匯編語(yǔ)言”四個(gè)字就覺(jué)得十分頭疼!匯編語(yǔ)言給人的第一印象就是一大堆難以看懂又不直觀的指令,而且不結(jié)構(gòu)化,大量的標(biāo)號(hào)、無(wú)條件跳轉(zhuǎn)指令(JMP)和條件跳轉(zhuǎn)指令讓你難以看懂程序;過(guò)程(或者函數(shù))的調(diào)用參數(shù)傳遞又不直觀,要么直接使用寄存器傳遞參數(shù),不符合結(jié)構(gòu)化程序設(shè)計(jì)原則;要么

9、使用堆棧傳遞參數(shù),又不能有效地檢驗(yàn)參數(shù)類型想必Win32匯編語(yǔ)言更麻煩吧!還好,MASM 6.0以上版本的匯編器提供了很多結(jié)構(gòu)化匯編語(yǔ)言偽指令,可以方便地實(shí)現(xiàn)匯編語(yǔ)言結(jié)構(gòu)化程序設(shè)計(jì),當(dāng)你看完本教程以后,你可能會(huì)感覺(jué)到:Win32匯編語(yǔ)言并不比C語(yǔ)言麻煩多少。(如果讀者看不懂本教程中的匯編語(yǔ)言源程序也不要緊,可以對(duì)照MASM 6.11的幫助看)和C語(yǔ)言Win32編程需要WINDOWS.H頭文件和其他Win32 API定義頭文件定義常量、數(shù)據(jù)結(jié)構(gòu)和API一樣,Win32匯編語(yǔ)言也需要包含文件(INC文件)定義常量、數(shù)據(jù)結(jié)構(gòu)和API。不過(guò)筆者找了很長(zhǎng)時(shí)間也沒(méi)有找到一個(gè)完整的可用于Win32匯編語(yǔ)言的

10、WINDOWS.INC文件或者WIN32.INC文件(倒是找到了用于Win16匯編語(yǔ)言的WINDOWS.INC文件),Turbo MASM 5.0中提供的WIN32.INC文件也不完整,只能用于自帶的WAP32例子程序,而且與MASM 6.11不太兼容(聽說(shuō)NASM中有完整的WIN32.INC文件,可惜沒(méi)有找到,也不知道與MASM 6.11是否兼容)。筆者只好自己定義常量、數(shù)據(jù)結(jié)構(gòu)和API(根據(jù)WINDOWS.H頭文件和其他Win32 API定義頭文件定義),不過(guò)這倒帶來(lái)了不少好處可以更好地了解Win32匯編語(yǔ)言的編程方法和原理。筆者編寫了一個(gè)簡(jiǎn)單的Win32匯編語(yǔ)言程序,該程序的功能很簡(jiǎn)單:

11、在屏幕上顯示一個(gè)消息框。本程序只調(diào)用了兩個(gè)API函數(shù):MessageBox函數(shù)和ExitProcess函數(shù),程序如下:包含文件(MSGBOX.INC):UINT TYPEDEF DWORDLPSTR TYPEDEF PTR BYTELPCSTR TYPEDEF LPSTRPVOID TYPEDEF PTRHANDLE TYPEDEF PVOIDHWND TYPEDEF HANDLEMB_ICONINFORMATION = 00000040hMB_OK = 00000000hMessageBoxA PROTO stdcall, :HWND,:LPCSTR,:LPCSTR,:UINTExitPro

12、cess PROTO stdcall, :UINT源程序(MSGBOX.ASM):.386p.MODEL flat,stdcallINCLUDE MSGBOX.INC.STACK 4096.DATAWindowTitle BYTE 'MsgBox',0Message1 BYTE 'This is a simple MessageBox Win32 application.',0.CODE_start:INVOKE MessageBoxA,0,ADDR Message1,ADDR WindowTitle,MB_ICONINFORMATION or MB_OKINV

13、OKE ExitProcess,0PUBLIC _startEND匯編連接本程序的命令如下:ml /c /coff /Cp msgbox.asmlink /subsystem:windows /entry:_start msgbox.obj kernel32.lib user32.lib匯編命令中的/c選項(xiàng)表示只匯編,不自動(dòng)連接;/coff選項(xiàng)表示生成COFF格式的OBJ文件(如果使用Borland的連接器不能使用/coff參數(shù));/Cp選項(xiàng)表示標(biāo)識(shí)符區(qū)分大小寫。連接命令中/subsystem:windows選項(xiàng)表示連接器生成普通Windows可執(zhí)行文件;/entry:_start選項(xiàng)表示程序

14、入口點(diǎn)是_start標(biāo)識(shí)符。連接時(shí)連接KERNEL32.LIB和USER32.LIB引入庫(kù)。運(yùn)行匯編連接后生成的MSGBOX.EXE文件,屏幕上將顯示出一個(gè)消息框,消息框的標(biāo)題是“MsgBox”,消息框中的字符串是“This is a simple MessageBox Win32 application.”。Win32匯編語(yǔ)言源程序應(yīng)該由.386p偽指令和.MODEL flat,stdcall偽指令開始,指示匯編器匯編386保護(hù)模式指令,并使用平坦內(nèi)存模式(Win32內(nèi)存模式)和stdcall函數(shù)調(diào)用方式(Win32標(biāo)準(zhǔn)函數(shù)調(diào)用方式)。PROTO偽指令定義函數(shù)原型(與C語(yǔ)言中函數(shù)原型的定義相

15、似),可以定義函數(shù)名、調(diào)用方式和參數(shù),INVOKE偽指令調(diào)用由PROTO偽指令定義的函數(shù),可以方便地傳遞參數(shù)和檢查參數(shù)類型。MSGBOX.INC文件中使用PROTO偽指令定義API函數(shù),MSGBOX.ASM文件中使用INVOKE偽指令調(diào)用API函數(shù),可見MASM 6.0以上版本的匯編器提供的結(jié)構(gòu)化匯編語(yǔ)言偽指令大大簡(jiǎn)化了Win32匯編語(yǔ)言編程(本程序一條匯編語(yǔ)言指令也沒(méi)有用到)。本程序調(diào)用了MessageBox函數(shù)顯示消息框以后,調(diào)用了ExitProcess函數(shù)終止程序的執(zhí)行,ExitProcess函數(shù)的作用是終止當(dāng)前進(jìn)程。五、顯示一個(gè)窗口的Win32匯編語(yǔ)言程序?qū)W習(xí)過(guò)Win32SDK編程的讀

16、者編寫的第一個(gè)應(yīng)用程序可能就是顯示一個(gè)窗口的C語(yǔ)言程序,筆者也編寫了這樣一個(gè)C語(yǔ)言程序,該程序文件名為SIMPLE.C,程序如下:#include static char szWindowClass="SIMPLE"LRESULT CALLBACK WndProc(HWND hWnd,UINT message,WPARAM wParam,LPARAM lParam);int WINAPI WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,LPSTR lpCmdLine,int nShowCmd)WNDCLASSEXA w

17、cex;HWND hWnd;MSG msg;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.hbrBackgr

18、ound=(HBRUSH)(COLOR_WINDOW+1); wcex.lpszMenuName=NULL; wcex.lpszClassName=szWindowClass; wcex.hIconSm=LoadIconA(hInstance,IDI_APPLICATION); if(!RegisterClassExA(&wcex) return FALSE;hWnd=CreateWindowExA(0,szWindowClass,"SIMPLE",WS_OVERLAPPEDWINDOW, CW_USEDEFAULT,CW_USEDEFAULT,CW_USEDEFA

19、ULT,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;PA

20、INTSTRUCT ps;switch(message)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;本程序與一般的顯示一個(gè)窗口的C語(yǔ)言程序基本相同,只是只使用ANSI字符集?,F(xiàn)在筆者用Win32匯編語(yǔ)言程序?qū)崿F(xiàn)本程序的功能,程序如下:包含文件(SIMPLE.

21、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

22、HANDLEtagWNDCLASSEXA STRUCTcbSize 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 STRUCTx L

23、ONG ?y LONG ?tagPOINT ENDSPOINT TYPEDEF tagPOINTtagMSG STRUCTmessage UINT ?wParam DWORD ?lParam DWORD ?time DWORD ?pt POINT <>tagMSG ENDSMSG TYPEDEF tagMSGLPMSG TYPEDEF PTR MSGtagRECT STRUCTleft LONG ?top LONG ?right LONG ?bottom LONG ?tagRECT ENDSRECT TYPEDEF tagRECTtagPAINTSTRUCT STRUCThdc D

24、WORD ?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 = 32

25、512IDC_ARROW = 32512COLOR_WINDOW = 5WS_OVERLAPPEDWINDOW = 00cf0000hCW_USEDEFAULT = 80000000hWM_PAINT = 000fhWM_DESTROY = 0002hGetModuleHandleA PROTO stdcall, :LPCSTRGetCommandLineA PROTO stdcallExitProcess PROTO stdcall, :UINTLoadIconA PROTO stdcall, :HINSTANCE,:LPCSTRLoadCursorA PROTO stdcall, :HIN

26、STANCE,: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,:

27、UINTTranslateMessage PROTO stdcall, :PTR MSGDispatchMessageA PROTO stdcall, :PTR MSGBeginPaint PROTO stdcall, :HWND,:LPPAINTSTRUCTEndPaint PROTO stdcall, :HWND,:PTR PAINTSTRUCTPostQuitMessage PROTO stdcall, :DWORDDefWindowProcA PROTO stdcall, :HWND,:UINT,:DWORD,:DWORD源程序(SIMPLE.ASM):.386p.MODEL flat

28、,stdcallINCLUDE SIMPLE.INCWinMain PROTO stdcall, :HINSTANCE,:HINSTANCE,:LPSTR,:DWORD.STACK 4096.DATAWindowClass BYTE 'SIMPLE',0WindowTitle BYTE 'SIMPLE',0hInst1 HINSTANCE 0lpCmdLine1 LPSTR 0.CODE_start:INVOKE GetModuleHandleA,NULLmov hInst1,eaxINVOKE GetCommandLineAmov lpCmdLine1,eax

29、INVOKE WinMain,hInst1,NULL,lpCmdLine1,SW_SHOWDEFAULTINVOKE ExitProcess,eax WinMain PROC hInst:HINSTANCE,hPrevInst:HINSTANCE,lpCmdLine:LPSTR,nShowCmd:DWORDLOCAL wcex:WNDCLASSEXALOCAL hWnd:HWNDLOCAL msg:MSG.IF !hPrevInst mov wcex.cbSize,SIZEOF WNDCLASSEXA mov wcex.style,CS_HREDRAW or CS_VREDRAW mov wc

30、ex.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.lpszC

31、lassName,OFFSET WindowClass INVOKE LoadIconA,hInst,IDI_APPLICATION mov wcex.hIconSm,eax INVOKE RegisterClassExA,ADDR wcex .IF !eax mov eax,FALSE ret .ENDIF.ENDIFINVOKE CreateWindowExA,0,ADDR WindowClass,ADDR WindowTitle,WS_OVERLAPPEDWINDOW,CW_USEDEFAULT,CW_USEDEFAULT,CW_USEDEFAULT,CW_USEDEFAULT,0,0,

32、hInst,NULLmov hWnd,eax.IF !eax mov eax,FALSE ret.ENDIFINVOKE ShowWindow,hWnd,nShowCmdINVOKE UpdateWindow,hWnd.WHILE TRUE INVOKE GetMessageA,ADDR msg,0,0,0 .BREAK .IF !eax INVOKE TranslateMessage,ADDR msg INVOKE DispatchMessageA,ADDR msg.ENDWmov eax,msg.wParamretWinMain ENDPWndProc PROC hWnd:HWND,mes

33、sage:UINT,wParam:DWORD,lParam:DWORDLOCAL hDC:HDCLOCAL 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.EN

34、DIFmov eax,0ffffffffhretWndProc ENDPPUBLIC _startEND匯編連接本程序的命令如下:ml /c /coff /Cp simple.asmlink /subsystem:windows /entry:_start simple.obj kernel32.lib user32.lib gdi32.lib運(yùn)行匯編連接后生成的SIMPLE.EXE文件,屏幕上將顯示出一個(gè)標(biāo)準(zhǔn)的窗口,窗口的標(biāo)題是“SIMPLE”。學(xué)習(xí)過(guò)Win32SDK編程的讀者都知道,Win32應(yīng)用程序的入口點(diǎn)是WinMain函數(shù),實(shí)際上WinMain函數(shù)是被C語(yǔ)言的初始化和結(jié)束代碼調(diào)用的,

35、Win32應(yīng)用程序的真正入口點(diǎn)和DOS應(yīng)用程序沒(méi)有什么區(qū)別,都是在文件頭中指定的應(yīng)用程序起始點(diǎn)。Win32匯編語(yǔ)言沒(méi)有C語(yǔ)言的初始化和結(jié)束代碼,必須自己編寫初始化和結(jié)束代碼調(diào)用WinMain函數(shù)(過(guò)程),WinMain函數(shù)的原型是:int WINAPI WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,LPSTR lpCmdLine,int nShowCmd);WinMain函數(shù)有4個(gè)參數(shù),分別是:hInstance應(yīng)用程序當(dāng)前實(shí)例的句柄,可以通過(guò)調(diào)用GetModuleHandle函數(shù)獲取.hPrevInstance應(yīng)用程序前一個(gè)實(shí)例的句柄

36、,Win32中當(dāng)前地址空間中不會(huì)有應(yīng)用程序的其他實(shí)例在運(yùn)行,該參數(shù)通常設(shè)置為NULL(提供該參數(shù)只是便于移植Win16應(yīng)用程序源程序)。lpCmdLine命令行參數(shù),可以通過(guò)調(diào)用GetCommandLine函數(shù)獲取。nShowCmd主窗口的顯示狀態(tài),可以設(shè)置成SW_SHOWDEFAULT(缺省狀態(tài))。本程序的初始化和結(jié)束代碼如下:INVOKE GetModuleHandleA,NULLmov hInst1,eaxINVOKE GetCommandLineAmov lpCmdLine1,eaxINVOKE WinMain,hInst1,NULL,lpCmdLine1,SW_SHOWDEFAULT

37、INVOKE ExitProcess,eax Win32標(biāo)準(zhǔn)函數(shù)調(diào)用方式,函數(shù)返回值通過(guò)EAX寄存器返回??梢姳境绦虻某跏蓟徒Y(jié)束代碼很簡(jiǎn)單,只是調(diào)用GetModuleHandle函數(shù)獲取應(yīng)用程序當(dāng)前實(shí)例的句柄,調(diào)用GetCommandLine函數(shù)獲取命令行參數(shù),然后調(diào)用WinMain函數(shù)(過(guò)程),WinMain函數(shù)返回后調(diào)用ExitProcess函數(shù)終止程序的執(zhí)行。將本程序與SIMPLE.C程序比較,可以看出程序結(jié)構(gòu)十分相似,本程序大量使用了MASM 6.0以上版本的匯編器提供的結(jié)構(gòu)化匯編語(yǔ)言偽指令,并不比C語(yǔ)言麻煩多少。六、資源在Win32匯編語(yǔ)言程序中的使用資源在Win32應(yīng)用程序中是很

38、重要的,筆者編寫了一個(gè)使用資源的C語(yǔ)言程序,該程序?qū)崿F(xiàn)了菜單和一個(gè)“About”對(duì)話框,程序如下:源程序(GENERIC.C):#include #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,W

39、PARAM 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.

40、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_

41、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(

42、&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;

43、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: r

44、eturn 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; retur

45、n 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/ Chines

46、e (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

47、"&Help" BEGIN MENUITEM "&About.", IDM_ABOUT ENDEND#ifdef APSTUDIO_INVOKED/ TEXTINCLUDE/1 TEXTINCLUDE DISCARDABLE BEGIN "resource.h0"END2 TEXTINCLUDE DISCARDABLE BEGIN "#include ""afxres.h""rn" "0"END3 TEXTINCLUDE DISCARDAB

48、LE BEGIN "rn" "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 DEFPUSHBU

49、TTON "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/ Generate

50、d from the TEXTINCLUDE 3 resource./#endif / not APSTUDIO_INVOKED資源頭文件(RESOURCE.H,Visual C+ 6.0自動(dòng)建立):/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 40

51、002/ 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#define _APS_NEXT_SYMED_VALUE 101#endif#endif本程序與一般Win32編程資料中的GENERIC程序基本相同,只是只使用ANSI字符集?,F(xiàn)在筆者用Win32匯編語(yǔ)言程序?qū)崿F(xiàn)本程序的功能,程序如下:包含文件(GENERIC.INC):UINT TYPEDEF DW

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論