第一个win32汇编窗口程序,主要来自 win32汇编语言程序设计,然后加上了自己查阅msdn文档的一些理解,基本过程:
start入口地址 --> _WinMain主函数 --> 定义一些需要用的消息实体和类实体 --> 注册窗口类 --> 建立并显示窗口 --> 消息循环
( _ProcMain主要用于处理程序接受的消息 )
1 ;模式定义 2 ;>>>>>>>>>>>>>>>>>>>>>>> 3 .386 ;需要的指令集 (80386) 4 .model flat,stdcall 5 option casemap:none 6 ;>>>>>>>>>>>>>>>>>>>>>>>>>>>> 7 ;Include 文件定义 8 ;>>>>>>>>>>>>>>>>>>>>>>>> 9 include windows.inc 10 include user32.inc 11 includelib user32.lib 12 include kernel32.inc 13 includelib kernel32.lib 14 15 ;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> 16 ;数据段 17 ;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> 18 .data? ;未初始化 19 hInstance dd ? ;本程序的句柄 20 hWinMain dd ? ;本程序主窗口 21 22 .const 23 szClassName db 'MyClass',0 ;窗口名字 24 szCaptionMain db 'My first Window !',0 ;窗口标题栏文字 25 szText db 'Win32 Assembly, Simple and powerful !',0 ;窗口文字 26 27 ;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> 28 ;代码段 29 ;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> 30 .code 31 ;******************************************************************** 32 ; 定义窗口过程 33 ; hWnd:窗口句柄 34 ; uWsg:消息标识 35 ; wParm:消息附带参数 36 ; lParam:消息附带参数 37 ;******************************************************************** 38 ;uses伪操作在进入时自动加上push,退出时自动加上pop,保护这些寄存器,否则程序出错 39 _ProcWinMain proc uses ebx edi esi hWnd,uMsg,wParam,lParam 40 local @stPs:PAINTSTRUCT ;接受绘制窗口信息 41 local @stRect:RECT 42 local @hDc 43 mov eax,uMsg 44 .if eax == WM_PAINT ;可以在showwindow或者updatewindow的时候获得这个消息,从而用这个消息来自己定制窗口 45 invoke BeginPaint,hWnd,addr @stPs 46 mov @hDc,eax ;函数是否运行成功,为NULL表示运行失败 47 invoke GetClientRect,hWnd,addr @stRect ;stRect获取窗口显示文本的信息 48 ;绘制文本 49 invoke DrawText,@hDc,addr szText,-1, 50 addr @stRect, 51 DT_SINGLELINE or DT_CENTER or DT_VCENTER 52 invoke EndPaint,hWnd,addr @stPs 53 .elseif eax == WM_CLOSE 54 invoke DestroyWindow,hWinMain ;摧毁窗口 55 invoke PostQuitMessage,NULL ;退出码(必要) 56 .else 57 invoke DefWindowProc,hWnd,uMsg,wParam,lParam ;将不感兴趣的消息交给系统处理 58 ret 59 .endif 60 61 xor eax,eax ;清空eax为0 62 ret ;一般默认返回0表示处理信息成功 63 _ProcWinMain endp 64 65 ;******************************************************************** 66 ; main函数 67 ;******************************************************************** 68 _WinMain proc 69 local @stWndClass:WNDCLASSEX ;定义实体stWndClass 70 local @stMsg:MSG ;定义消息实体 71 72 invoke GetModuleHandle,NULL ;获取当前程序的句柄 73 mov hInstance,eax ;把获得的句柄赋值给hInstance 74 invoke RtlZeroMemory,addr @stWndClass,sizeof @stWndClass;清零 75 ;******************************************************************** 76 ; 注册窗口类 77 ;******************************************************************** 78 invoke LoadCursor,0,IDC_ARROW ;加载光标 79 mov @stWndClass.hCursor,eax ;光标 80 push hInstance 81 pop @stWndClass.hInstance ;窗口类所属模块 82 mov @stWndClass.cbSize,sizeof WNDCLASSEX ;WNDCLASSEX大小 83 mov @stWndClass.style,CS_HREDRAW or CS_VREDRAW;窗口风格 84 ;指定基于这个类建立的窗口过程地址(重要) 85 mov @stWndClass.lpfnWndProc,offset _ProcWinMain 86 mov @stWndClass.hbrBackground,COLOR_WINDOW + 1 ;窗口客户区背景色 87 mov @stWndClass.lpszClassName,offset szClassName;要建立的类的命名 88 invoke RegisterClassEx,addr @stWndClass ;注册类 stWndClass 89 ;******************************************************************** 90 ; 建立并显示窗口 91 ;******************************************************************** 92 invoke CreateWindowEx, ;创建一个窗口 93 WS_EX_CLIENTEDGE, ;有sunken edge 的窗口??? 94 offset szClassName, ;窗口类的名字 95 offset szCaptionMain, ;窗口类的标题文字 96 WS_OVERLAPPEDWINDOW, ;窗口的一些属性 97 100,100,600,400, ;位置(x,y) 宽高(width,height) 98 NULL,NULL, ;可选项 99 hInstance,NULL; ;句柄,参数【可选】 100 mov hWinMain,eax ;把新建到的窗口的句柄给hWinMain 101 invoke ShowWindow,hWinMain,SW_SHOWNORMAL ;显示窗口,正常显示 102 invoke UpdateWindow,hWinMain ;更新窗口的主要部分 103 ;******************************************************************** 104 ; 消息循环 105 ;******************************************************************** 106 .while TRUE 107 invoke GetMessage,addr @stMsg,NULL,0,0 108 .break .if eax == 0 ;如果点击了退出就结束程序 109 invoke TranslateMessage,addr @stMsg ;进行键盘消息的转换 110 invoke DispatchMessage,addr @stMsg ;将消息发送到对应窗口的过程处理函数中处理 111 .endw 112 ret 113 _WinMain endp 114 115 ;******************************************************************** 116 ; 程序入口地址 117 ;******************************************************************** 118 start: 119 call _WinMain 120 invoke ExitProcess,NULL ;退出程序 121 ;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> 122 end start