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 汇编子过程总结相关推荐
- Win32汇编:过程与宏调用
堆栈操作指令 在计算机领域,堆栈是一个不容忽视的概念,堆栈是一种后进先出(LIFO,Last-In,First-Out)的数据结构,这是因为最后压入堆栈的值总是最先被取出,而新数值在执行PUSH压栈时 ...
- x86汇编_Irvine32链接库的子过程isdigit源代码讲解_笔记42
Irvine32链接库的isdigit源代码 首先回顾一下0~9这10个字符以ASCII码表示,它们的二进制.十六进制.十进制分别是什么. 二进制 十进制 十六进制 字符 00110000 48 30 ...
- C指针原理(23)-win32汇编及.NET调试
2018-12-28 20:36:07 在WINDOWS系统能用到汇编的机会不多,基本都可以用C或C++代劳,更何况现在MICROSOFT的Visual Studio 系列工具非常强大,WINDOWS ...
- win32 汇编基础概念整理
一.关于寄存器 寄存器有EAX,EBX,ECX,EDX,EDI,ESI,ESP,EBP等,似乎IP也是寄存器,但只有在CALL/RET在中会默认使用它,其它情况很少使用到,暂时可以不用理会. EAX是 ...
- win32汇编基础概念
一.关于寄存器 寄存器有EAX,EBX,ECX,EDX,EDI,ESI,ESP,EBP等,似乎IP也是寄存器,但只有在CALL/RET在中会默认使用它,其它情况很少使用到,暂时可以不用理会. EAX是 ...
- 【Win32汇编】学习Win32汇编
学习Win32汇编(Windows下的32位汇编) 第一个程序Hello world 控制台输出(新建Console App工程) Debug输出(新建Win32 App工程) 后面代码的头文件在这里 ...
- win32汇编实现拼接SQL语句
字符串合并,在汇编语言,一般是用loop循环和cx寄存器,自己编程实现: 如果是win32汇编,可以使用movsb指令: 一般开发应用程序都会碰到拼接SQL语句,在C#这些语言用字符串连接的加号就可以 ...
- Win32汇编获取和设置文本框的内容
看一下Win32汇编如何获取和设置文本框的内容: 资源文件如下: #include <resource.h>#define ICO_MAIN 0x1000 //图标 #define DLG ...
- Win32 汇编语句模板
Win32 汇编语句模板 一 变量 ;句柄 hInstance dd 0 hWnd dd 0 hPen dd 0 hPend dd 0 oldPen dd 0;过程变量 hInst :DWORD hP ...
最新文章
- java floatmath_【Android】解决FloatMath类中方法在API 23以后不存在问题
- SVN合并(merge)的使用
- Git在版本2.13中继续改进了安全性和UI
- Programming 2D Games 读书笔记(第二章)
- Java计算两日期相差天数源码
- python 判断文件夹是否存在 否则创建
- simulink的pid参数自整定
- JasperReport生成pdf文件 Java开发pdf文件 pdf文件生成及下载
- “木兰”致歉背后的思考,为什么物联网也能用Python
- MATLB|基于粒子群算法的能源管理系统EMS(考虑光伏、储能 、柴油机系统)
- linux中touch命令如何使用,一天一个shell命令 linux文本操作系列-touch命令用法
- 数据科学家技能树(中文翻译版)
- SQLServer删除数据列
- 数字孪生在制造业的7种应用
- 计算机网络的产生与发展
- Android A/B System OTA分析(三)主系统和bootloader的通信
- mac os系统截屏快捷键
- STM32嵌入式FLASH擦除与写入
- 3星|《三联生活周刊》2017年40期:中国迈入高收入国家门槛几乎是板上钉钉的事...
- JAVA SHA-1加密及DES加解密