用RadASM新建一个Win32 APP的工程后,我们就可以编写程序了(除了填写工程名,其余的均可以默认),下面给出一个最简单的窗口程序的源代码:(代码贴上去的时候格式上有点变乱)
[以后的更新如果涉及窗口则均会以此作为模板,希望为各位初学者带去便利]
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> ;NAME: Windows Templet ;BY: 千與千尋 ;DATE:2011-3-5 ;FUNCTION:Show a normal window on the screen ;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> .386 ;告诉编译器本程序中所使用的指令集,如: .8086, ,386/.386p .model flat,stdcall ;.model内存模式 [,语言模式][,其它模式] option casemap:none ;定义了程序中的变量和程序名是否对大小写敏感 ;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> ;Include File ;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> include windows.inc ;包含Win32程序用到的常量、结构的声明 include kernel32.inc ;包含对应DLL的函数、常量、结构的声明 include user32.inc ;包含对应DLL的函数、常量、结构的声明 includelib kernel32.lib ;包含动态库函数的地址信息和静态库的函数代码,程序链接时提取 includelib user32.lib ;kernerl32.dll 是系统服务接口负责内存管理等 ;user32.dll 是用户服务接口,负责消息管理等 ;对DLL(动态库),程序运行时会根据这些地址信息去调用DLL中相应的函数 ;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> ;Data Segment ;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> .data ;一些初始化过后变量的定义,例如定义一个结构体变量: ;stWndClass WNDCLASS <> .data? ;一些没有初始化过的变量的定义 hInstance dd ? ;定义模块句柄 hWinMain dd ? ;定义窗口句柄 .const ;一些常量的定义 szClassName db 'MyClass',0 szCaption db 'My Window',0 ;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> ;Code Segment ;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> .code ;******************************************************************* ;_WinMain ;******************************************************************* _WinMain proc LOCAL @stWndClass:WNDCLASSEX ;定义一个WNDCLASS数据结构 LOCAL @stMsg:MSG ;定义一个MSG数据结构 ;将WNDCLASSEX结构变量@stWndClass,用RtlZeroMemory将它填为全0,再填写 ;结构体变量中的其它字段,这样,没有赋值的就保持为0 invoke RtlZeroMemory,addr @stWndClass,sizeof @stWndClass ;----------------[取本模块句柄]--------------------------- invoke GetModuleHandle,NULL mov hInstance,eax ;----------------[设计窗口类]---------------------------- push hInstance pop @stWndClass.hInstance ;本模块实例句柄 mov @stWndClass.cbSize,sizeof WNDCLASSEX ;WNDCLASS的大小 mov @stWndClass.style,CS_HREDRAW or CS_VREDRAW ;窗口的风格 mov @stWndClass.lpfnWndProc,offset _ProcWinMain ;窗口过程函数 mov @stWndClass.hbrBackground,COLOR_WINDOW+1 ;窗口的背景色 mov @stWndClass.lpszClassName,offset szClassName ;窗口类的名称 invoke LoadCursor,0,IDC_ARROW mov @stWndClass.hCursor,eax ;-----------------[注册窗口类]--------------------------- invoke RegisterClassEx,addr @stWndClass ;-----------------[创建窗口]---------------------------- invoke CreateWindowEx,WS_EX_CLIENTEDGE,offset szClassName,\ offset szCaption,WS_OVERLAPPEDWINDOW,\ 100,100,600,400,NULL,NULL,hInstance,NULL mov hWinMain,eax ;-----------------[显示窗口]---------------------------- invoke ShowWindow,hWinMain,SW_SHOWNORMAL ;-----------------[更新窗口]---------------------------- invoke UpdateWindow,hWinMain ;-----------------[消息循环]---------------------------- .while TRUE invoke GetMessage,addr @stMsg,NULL,0,0 .break .if eax==0 invoke TranslateMessage,addr @stMsg invoke DispatchMessage,addr @stMsg .endw ret _WinMain endp ;****************************************************************** ;_ProcWinMain窗口过程处理函数 ;****************************************************************** _ProcWinMain proc uses ebx esi edi hWnd,uMsg,wParam,lParam mov eax,uMsg .if eax==WM_CLOSE invoke DestroyWindow,hWinMain invoke PostQuitMessage,NULL .elseif invoke DefWindowProc,hWnd,uMsg,wParam,lParam ret ;将eax不做修改地用ret返回,如果丢了这一句,相当于在处理大多数消息 .endif ;的时候没有返回正确的值. xor eax,eax ret _ProcWinMain endp ;******************************************************************* start: call _WinMain invoke ExitProcess,NULL end start