Win32 汇编子过程总结
生活随笔
收集整理的這篇文章主要介紹了
Win32 汇编子过程总结
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
第一部分 窗口和消息處理
WinMain函數(應用程序入口)
WinMain proc hInst :DWORD,hPrevInst :DWORD,CmdLine :DWORD,CmdShow :DWORD;====================; Put LOCALs on stack;====================LOCAL wc :WNDCLASSEXLOCAL msg :MSGLOCAL Wwd :DWORDLOCAL Wht :DWORDLOCAL Wtx :DWORDLOCAL Wty :DWORD;==================================================; Fill WNDCLASSEX structure with required variables;==================================================invoke LoadIcon,hInst,1 ; icon IDmov hIcon, eaxszText szClassName,"bmbtn_Class"mov wc.cbSize, sizeof WNDCLASSEXmov wc.style, CS_HREDRAW or CS_VREDRAW \or CS_BYTEALIGNWINDOWmov wc.lpfnWndProc, offset WndProcmov wc.cbClsExtra, NULLmov wc.cbWndExtra, NULLm2m wc.hInstance, hInstmov wc.hbrBackground, COLOR_BTNFACE+1mov wc.lpszMenuName, NULLmov wc.lpszClassName, offset szClassNamem2m wc.hIcon, hIconinvoke LoadCursor,NULL,IDC_ARROWmov wc.hCursor, eaxm2m wc.hIconSm, hIconinvoke RegisterClassEx, ADDR wc;================================; Centre window at following size;================================mov Wwd, 250mov Wht, 150invoke GetSystemMetrics,SM_CXSCREENinvoke TopXY,Wwd,eaxmov Wtx, eaxinvoke GetSystemMetrics,SM_CYSCREENinvoke TopXY,Wht,eaxmov Wty, eaxinvoke CreateWindowEx,WS_EX_LEFT,ADDR szClassName,ADDR szDisplayName,WS_OVERLAPPED or WS_SYSMENU,Wtx,Wty,Wwd,Wht,NULL,NULL,hInst,NULLmov hWnd,eaxinvoke LoadMenu,hInst,600 ; menu IDinvoke SetMenu,hWnd,eaxinvoke ShowWindow,hWnd,SW_SHOWNORMALinvoke UpdateWindow,hWnd;===================================; Loop until PostQuitMessage is sent;===================================StartLoop:invoke GetMessage,ADDR msg,NULL,0,0cmp eax, 0je ExitLoopinvoke TranslateMessage, ADDR msginvoke DispatchMessage, ADDR msgjmp StartLoopExitLoop:return msg.wParamWinMain endp窗口過程函數(WndProc)
WndProc proc hWin :DWORD,uMsg :DWORD,wParam :DWORD,lParam :DWORDLOCAL var :DWORDLOCAL caW :DWORDLOCAL caH :DWORDLOCAL Rct :RECTLOCAL hDC :DWORDLOCAL Ps :PAINTSTRUCTLOCAL buffer1[128]:BYTE ; these are two spare buffersLOCAL buffer2[128]:BYTE ; for text manipulation etc...if uMsg == WM_COMMAND.if wParam == 400.endif;======== menu commands ========.elseif uMsg == WM_CREATE.elseif uMsg == WM_SIZE.elseif uMsg == WM_PAINTinvoke BeginPaint,hWin,ADDR Psmov hDC, eaxinvoke Paint_Proc,hWin,hDCinvoke EndPaint,hWin,ADDR Psreturn 0.elseif uMsg == WM_CLOSE.elseif uMsg == WM_DESTROYinvoke PostQuitMessage,NULLreturn 0 .endifinvoke DefWindowProc,hWin,uMsg,wParam,lParamretWndProc endp注冊窗口類過程
RegisterWinClass proc lpWndProc:DWORD, lpClassName:DWORD,Icon:DWORD, Cursor:DWORD, bColor:DWORDLOCAL wc:WNDCLASSEXmov wc.cbSize, sizeof WNDCLASSEXmov wc.style, CS_BYTEALIGNCLIENT or \CS_BYTEALIGNWINDOWm2m wc.lpfnWndProc, lpWndProcmov wc.cbClsExtra, NULLmov wc.cbWndExtra, NULLm2m wc.hInstance, hInstancem2m wc.hbrBackground, bColormov wc.lpszMenuName, NULLm2m wc.lpszClassName, lpClassNamem2m wc.hIcon, Iconm2m wc.hCursor, Cursorm2m wc.hIconSm, Iconinvoke RegisterClassEx, ADDR wcretRegisterWinClass endp消息循環過程
MsgLoop proc; ------------------------------------------; The following 4 equates are available for; processing messages directly in the loop.; m_hWnd - m_Msg - m_wParam - m_lParam; ------------------------------------------LOCAL msg:MSGStartLoop:invoke GetMessage,ADDR msg,NULL,0,0cmp eax, 0je ExitLoopinvoke TranslateMessage, ADDR msginvoke DispatchMessage, ADDR msgjmp StartLoopExitLoop:mov eax, msg.wParamretMsgLoop endp對話框窗口過程
dlgproc proc hWin:DWORD,uMsg:DWORD,wParam:DWORD,lParam:DWORD.if uMsg == WM_INITDIALOGinvoke SendMessage,hWin,WM_SETICON,1,FUNC(LoadIcon,NULL,IDI_ASTERISK).elseif uMsg == WM_COMMAND.if wParam == IDCANCELjmp quit_dialog.endif.elseif uMsg == WM_CLOSEquit_dialog:invoke EndDialog,hWin,0.endifxor eax, eaxretdlgproc endp
第二部分 控件
按鈕過程
BtnProc proc hCtl :DWORD,uMsg :DWORD,wParam :DWORD,lParam :DWORD.if uMsg == WM_KEYDOWNjmp lbd.elseif uMsg == WM_KEYUPjmp lbu.elseif uMsg == WM_LBUTTONDOWNlbd:invoke LoadIcon,hInstance,3invoke SendMessage,hBtn2,BM_SETIMAGE,1,eax.elseif uMsg == WM_LBUTTONUPlbu:invoke LoadIcon,hInstance,2invoke SendMessage,hBtn2,BM_SETIMAGE,1,eax.endifinvoke CallWindowProc,lpBtnProc,hCtl,uMsg,wParam,lParamretBtnProc endp圖標按鈕過程
IconButton proc hParent:DWORD,a:DWORD,b:DWORD,wd:DWORD,ht:DWORD,ID:DWORD; IconButton PROTO :DWORD,:DWORD,:DWORD,:DWORD,:DWORD,:DWORD ; invoke IconButton,hWnd,20,20,100,25,500szText icoBtnCl,"BUTTON"szText blnk1,0invoke CreateWindowEx,0,ADDR icoBtnCl,ADDR blnk1,WS_CHILD or WS_VISIBLE or BS_ICON,a,b,wd,ht,hParent,ID,hInstance,NULLretIconButton endp位圖按鈕過程
BmpButton proc hParent:DWORD,a:DWORD,b:DWORD,wd:DWORD,ht:DWORD,ID:DWORD; BmpButton PROTO :DWORD,:DWORD,:DWORD,:DWORD,:DWORD,:DWORD ; invoke BmpButton,hWnd,20,20,100,25,500szText bmpBtnCl,"BUTTON"szText blnk2,0invoke CreateWindowEx,0,ADDR bmpBtnCl,ADDR blnk2,WS_CHILD or WS_VISIBLE or BS_BITMAP,a,b,wd,ht,hParent,ID,hInstance,NULLretBmpButton endp創建列表框
ListBox proc a:DWORD,b:DWORD,wd:DWORD,ht:DWORD,hParent:DWORD,ID:DWORDszText lstBox,"LISTBOX"invoke CreateWindowEx,WS_EX_CLIENTEDGE,ADDR lstBox,0,WS_VSCROLL or WS_VISIBLE or \WS_BORDER or WS_CHILD or \LBS_HASSTRINGS or LBS_NOINTEGRALHEIGHT or \LBS_DISABLENOSCROLL,a,b,wd,ht,hParent,ID,hInstance,NULLretListBox endp列表框消息處理過程
ListBoxProc proc hCtl :DWORD,uMsg :DWORD,wParam :DWORD,lParam :DWORDLOCAL IndexItem :DWORDLOCAL Buffer[32] :BYTE.if uMsg == WM_LBUTTONDBLCLKjmp DoIt.elseif uMsg == WM_CHAR.if wParam == 13jmp DoIt.endif.endifjmp EndDoDoIt:invoke SendMessage,hCtl,LB_GETCURSEL,0,0mov IndexItem, eaxinvoke SendMessage,hCtl,LB_GETTEXT,IndexItem,ADDR Buffermov eax, hList1.if hCtl == eaxszText CurSel1,"You selected from hList1"invoke MessageBox,hWnd,ADDR Buffer,ADDR CurSel1,MB_OK.elseszText CurSel2,"You selected from hList2"invoke MessageBox,hWnd,ADDR Buffer,ADDR CurSel2,MB_OK.endifEndDo:invoke CallWindowProc,lpLstBox1,hCtl,uMsg,wParam,lParamretListBoxProc endp
創建工具條
Do_ToolBar proc hWin :DWORDLOCAL bSize :DWORDLOCAL tbab :TBADDBITMAPLOCAL tbb :TBBUTTON; ------------------------; Uncomment following when; bitmap has been created; ------------------------; invoke LoadBitmap,hInstance,750; mov hTbBmp,eax; --------------------------------------------------; Set toolbar button dimensions here, width & height; --------------------------------------------------Create_Tool_Bar 25, 25TBextraData ; additional data for TBBUTTON structure; -----------------------------------; Add toolbar buttons and spaces here; Syntax for the macro TBbutton is; TBbutton bmpID number, WM_COMMAND ID number; WM_COMMAND ID numbers start at 50; -----------------------------------TBblankTBbutton 0, 50; TBbutton 1, 51; TBbutton 2, 52; TBblank; TBbutton 3, 53; TBbutton 4, 54; TBbutton 5, 55; TBblank; TBbutton 6, 56; TBbutton 7, 57; TBbutton 8, 58retDo_ToolBar endp第三部分?
第四部分
第五部分 GDI、坐標、繪圖
獲取中點坐標
TopXY proc wDim:DWORD, sDim:DWORDshr sDim, 1 ; divide screen dimension by 2shr wDim, 1 ; divide window dimension by 2mov eax, wDim ; copy window dimension into eaxsub sDim, eax ; sub half win dimension from half screen dimensionreturn sDimTopXY endp繪圖過程
Paint_Proc proc hWin:DWORD, hDC:DWORDLOCAL btn_hi :DWORDLOCAL btn_lo :DWORDLOCAL Rct :RECTinvoke GetSysColor,COLOR_BTNHIGHLIGHTmov btn_hi, eaxinvoke GetSysColor,COLOR_BTNSHADOWmov btn_lo, eaxreturn 0Paint_Proc endp
第六部分
第七部分?
第八部分 字符串操作
填充緩沖區
FillBuffer proc lpBuffer:DWORD,lenBuffer:DWORD,TheChar:BYTEpush edimov edi, lpBuffer ; address of buffermov ecx, lenBuffer ; buffer lengthmov al, TheChar ; load al with characterrep stosb ; write character to buffer until ecx = 0pop ediretFillBuffer endp
第九部分 文件操作
得到打開的文件名
GetFileName proc hParent:DWORD,lpTitle:DWORD,lpFilter:DWORDmov ofn.lStructSize, sizeof OPENFILENAMEm2m ofn.hWndOwner, hParentm2m ofn.hInstance, hInstancem2m ofn.lpstrFilter, lpFilterm2m ofn.lpstrFile, offset szFileNamemov ofn.nMaxFile, sizeof szFileNamem2m ofn.lpstrTitle, lpTitlemov ofn.Flags, OFN_EXPLORER or OFN_FILEMUSTEXIST or \OFN_LONGNAMESinvoke GetOpenFileName,ADDR ofnretGetFileName endp保存文件名
SaveFileName proc hParent:DWORD,lpTitle:DWORD,lpFilter:DWORDmov ofn.lStructSize, sizeof OPENFILENAMEm2m ofn.hWndOwner, hParentm2m ofn.hInstance, hInstancem2m ofn.lpstrFilter, lpFilterm2m ofn.lpstrFile, offset szFileNamemov ofn.nMaxFile, sizeof szFileNamem2m ofn.lpstrTitle, lpTitlemov ofn.Flags, OFN_EXPLORER or OFN_LONGNAMESinvoke GetSaveFileName,ADDR ofnretSaveFileName endp
讀磁盤文件
read_diskfile proc lpName:DWORD,lpMem:DWORDLOCAL hFile :DWORDLOCAL fl :DWORDLOCAL bRead :DWORDLOCAL Mem :DWORDinvoke CreateFile,lpName,GENERIC_READ,0,NULL,OPEN_EXISTING,NULL,NULLmov hFile, eaxinvoke GetFileSize,hFile,NULLmov fl, eax; -----------------------; allocate string memory; -----------------------invoke SysAllocStringByteLen,0,flmov Mem, eax; ---------------------------------------------------; write handle to DWORD variable passed as parameter; ---------------------------------------------------mov ecx, lpMemmov [ecx], eaxinvoke ReadFile,hFile,Mem,fl,ADDR bRead,NULLinvoke CloseHandle,hFile; -------------------------; return bytes read in EAX; -------------------------mov eax, bReadretread_diskfile endp寫磁盤文件
disk_write proc lpName:DWORD,lpData:DWORD,fl:DWORDLOCAL hOutput:DWORDLOCAL bw :DWORDinvoke CreateFile,lpName,GENERIC_WRITE,NULL,NULL,CREATE_ALWAYS,FILE_ATTRIBUTE_NORMAL,NULLmov hOutput, eaxinvoke WriteFile,hOutput,lpData,fl,ADDR bw,NULLinvoke CloseHandle,hOutputmov eax, bw ; return written byte countretdisk_write endp文件搜索過程
SearchForFile PROC StartPath:DWORD,FileToFind:DWORDLOCAL WFD:WIN32_FIND_DATA ; used for file/folder searchLOCAL fPath[260]:BYTE ; used to store StartPath locallyLOCAL fPath2[260]:BYTE ; we add sub-folders names onto this to form full pathsLOCAL hFind:DWORD ; find handle; Below is just some little data's that we need in order for function to workjmp @FWildCard db "\*",0 ; search ALL filesCRLF db 13,10,0 ; tell me you don't know what this isfoundat db "Found: ",0 ; tell the user we found a file that matches@@:lea edi,fPathpush edi ; save EDI in stackmov esi,StartPath ; we are copying supplied StartPath to our buffermov ecx,256 ; all 256 bytesrep movsb ; copy pathpop edi ; put the path back in EDIxor al,al ; clear AL@GetToChar ; Find the first zeromov al,'\' ; now equals Drive:\Path\*stosb ; e.g.: C:\Windows\*mov al,'*'stosb @ClearFN ; clears the cFileName field in Win32_Find_Datainvoke FindFirstFile,addr fPath,addr WFD ; find first filepush eax ; mov hFind,eax ; save FindHandlepop ebx ; put handle in EBX.while ebx > 0 ; while a file is found..lea esi,WFD.cFileNamelodsw ; get first two chars.if AX!=02E2Eh && AX!=0002Eh ; '..' and '.' lea edi,WFDmov eax,[edi] ; file attributes.if ax & FILE_ATTRIBUTE_DIRECTORY ; is it a directory?sub esi,2 ; undo the lodswlea edi,fPath2 ; load up the secondary path in EDIpush edi ; save it on the stack...xor al,al ; clear secondary pathmov ecx,260 ; ..rep stosbmov edi,[esp] ; restore EDIlea eax,fPath ; first pathinvoke lstrcpy,edi,eax ; copy first to secondmov al,'*' ; get to the end....@GetToCharmov byte ptr [edi],00h ; delete the wildcardinvoke lstrcat,edi,esi ; tack on the new directory namepop edi ; restore EDI from stackpushad ; must save ALL regs or errors will ocur :)invoke SearchForFile,edi,FileToFind ; call function againpopad ; restore all regs.elsesub esi,2 ; undo the lodswinvoke lstrcmpi,FileToFind,esi ; case insensitive compareor eax,eax ; are they equal?jz found_file ; if eax=0 they are equal.endif.endif@ClearFN ; Clear the cFileName field againinvoke FindNextFile,hFind,addr WFDmov ebx,eax.endw __cls_fnd:invoke FindClose,hFind ; close it upretfound_file: ; we found a file, so we report it to the userlea edi,fPath2invoke lstrcpy,edi,addr fPathmov al,'*'scasbjnz $-1dec edimov byte ptr [edi],00hlea edi,WFD.cFileNameinvoke lstrcat,addr fPath2,ediinvoke StdOut,addr foundatinvoke StdOut,addr fPath2invoke StdOut,addr CRLFjmp __cls_fndSearchForFile ENDP第十部分 圖形和位圖
設置位圖顏色
SetBmpColor proc hBitmap:DWORDLOCAL mDC :DWORDLOCAL hBrush :DWORDLOCAL hOldBmp :DWORDLOCAL hReturn :DWORDLOCAL hOldBrush :DWORDinvoke CreateCompatibleDC,NULLmov mDC,eaxinvoke SelectObject,mDC,hBitmapmov hOldBmp,eaxinvoke GetSysColor,COLOR_BTNFACEinvoke CreateSolidBrush,eaxmov hBrush,eaxinvoke SelectObject,mDC,hBrushmov hOldBrush,eaxinvoke GetPixel,mDC,1,1invoke ExtFloodFill,mDC,1,1,eax,FLOODFILLSURFACEinvoke SelectObject,mDC,hOldBrushinvoke DeleteObject,hBrushinvoke SelectObject,mDC,hBitmapmov hReturn,eaxinvoke DeleteDC,mDCmov eax,hReturnretSetBmpColor endp位圖過程
bmpProc proc hCtl :DWORD,uMsg :DWORD,wParam :DWORD,lParam :DWORD.if uMsg == WM_KEYDOWNjmp lbda.elseif uMsg == WM_KEYUPjmp lbua.elseif uMsg == WM_LBUTTONDOWNlbda:invoke SendMessage,hBtn4,BM_SETIMAGE,0,hBmp2.elseif uMsg == WM_LBUTTONUPlbua:invoke SendMessage,hBtn4,BM_SETIMAGE,0,hBmp1.endifinvoke CallWindowProc,lpfnbmpProc,hCtl,uMsg,wParam,lParamretbmpProc endp第二十部分 常用宏
insert TEXT into the code section
szText MACRO Name, Text:VARARGLOCAL lbljmp lblName db Text,0lbl:ENDM
copy from one memory location to another
m2m MACRO M1, M2push M2pop M1ENDM
?return宏
return MACRO argmov eax, argretENDM
總結
以上是生活随笔為你收集整理的Win32 汇编子过程总结的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: VS2010插件编写学习总结
- 下一篇: VS2010重构学习总结