第一部分 窗口和消息处理

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 汇编子过程总结相关推荐

  1. Win32汇编:过程与宏调用

    堆栈操作指令 在计算机领域,堆栈是一个不容忽视的概念,堆栈是一种后进先出(LIFO,Last-In,First-Out)的数据结构,这是因为最后压入堆栈的值总是最先被取出,而新数值在执行PUSH压栈时 ...

  2. x86汇编_Irvine32链接库的子过程isdigit源代码讲解_笔记42

    Irvine32链接库的isdigit源代码 首先回顾一下0~9这10个字符以ASCII码表示,它们的二进制.十六进制.十进制分别是什么. 二进制 十进制 十六进制 字符 00110000 48 30 ...

  3. C指针原理(23)-win32汇编及.NET调试

    2018-12-28 20:36:07 在WINDOWS系统能用到汇编的机会不多,基本都可以用C或C++代劳,更何况现在MICROSOFT的Visual Studio 系列工具非常强大,WINDOWS ...

  4. win32 汇编基础概念整理

    一.关于寄存器 寄存器有EAX,EBX,ECX,EDX,EDI,ESI,ESP,EBP等,似乎IP也是寄存器,但只有在CALL/RET在中会默认使用它,其它情况很少使用到,暂时可以不用理会. EAX是 ...

  5. win32汇编基础概念

    一.关于寄存器 寄存器有EAX,EBX,ECX,EDX,EDI,ESI,ESP,EBP等,似乎IP也是寄存器,但只有在CALL/RET在中会默认使用它,其它情况很少使用到,暂时可以不用理会. EAX是 ...

  6. 【Win32汇编】学习Win32汇编

    学习Win32汇编(Windows下的32位汇编) 第一个程序Hello world 控制台输出(新建Console App工程) Debug输出(新建Win32 App工程) 后面代码的头文件在这里 ...

  7. win32汇编实现拼接SQL语句

    字符串合并,在汇编语言,一般是用loop循环和cx寄存器,自己编程实现: 如果是win32汇编,可以使用movsb指令: 一般开发应用程序都会碰到拼接SQL语句,在C#这些语言用字符串连接的加号就可以 ...

  8. Win32汇编获取和设置文本框的内容

    看一下Win32汇编如何获取和设置文本框的内容: 资源文件如下: #include <resource.h>#define ICO_MAIN 0x1000 //图标 #define DLG ...

  9. Win32 汇编语句模板

    Win32 汇编语句模板 一 变量 ;句柄 hInstance dd 0 hWnd dd 0 hPen dd 0 hPend dd 0 oldPen dd 0;过程变量 hInst :DWORD hP ...

最新文章

  1. java floatmath_【Android】解决FloatMath类中方法在API 23以后不存在问题
  2. SVN合并(merge)的使用
  3. Git在版本2.13中继续改进了安全性和UI
  4. Programming 2D Games 读书笔记(第二章)
  5. Java计算两日期相差天数源码
  6. python 判断文件夹是否存在 否则创建
  7. simulink的pid参数自整定
  8. JasperReport生成pdf文件 Java开发pdf文件 pdf文件生成及下载
  9. “木兰”致歉背后的思考,为什么物联网也能用Python
  10. MATLB|基于粒子群算法的能源管理系统EMS(考虑光伏、储能 、柴油机系统)
  11. linux中touch命令如何使用,一天一个shell命令 linux文本操作系列-touch命令用法
  12. 数据科学家技能树(中文翻译版)
  13. SQLServer删除数据列
  14. 数字孪生在制造业的7种应用
  15. 计算机网络的产生与发展
  16. Android A/B System OTA分析(三)主系统和bootloader的通信
  17. mac os系统截屏快捷键
  18. STM32嵌入式FLASH擦除与写入
  19. 3星|《三联生活周刊》2017年40期:中国迈入高收入国家门槛几乎是板上钉钉的事...
  20. JAVA SHA-1加密及DES加解密

热门文章

  1. 基于XML的IOC案例
  2. Java的知识点31——线程同步
  3. C++中的istringstream 的用法
  4. opencv 线性滤波器
  5. pytorch下载mnist超时解决方案
  6. Linux命令行下关机【Ubuntu】
  7. Linux 系统工具
  8. .NET下日志系统的搭建——log4net+kafka+elk
  9. asm.js的陷阱1
  10. Android学习笔记之使用百度地图实现地图控制