.386 .model flat, stdcall option casemap:none ;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> ; Include 文件定义 ;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> include windows.inc include gdi32.inc includelib gdi32.lib include user32.inc includelib user32.lib include kernel32.inc includelib kernel32.lib include shell32.inc includelib shell32.lib ;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> ; 数据段 ;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> .data? hInstance dd ? hWinMain dd ? .const szClassName db 'MyClass', 0 szCaptionMain db 'My First Window!', 0 szText db 'HomePage: http://www.programlife.info/', 0 szMsgBoxCaption db '退出提示', 0 szMsgBoxText db '确定要退出程序吗?', 0 szURL db 'http://www.programlife.info/', 0 szOperation db 'open', 0 ;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> ; 代码段 ;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> .code ;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> ; 窗口过程 ;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> ;子程序的定义格式如下 ;子程序名 proc [uses 寄存器列表][,参数:类型] ;寄存器说明在程序中需要用到,程序会在最开始push这些寄存器? ;返回前会pop这些寄存器。Win32 Asm只有dword一种类型,所以可以省略 _ProcWinMain proc uses ebx edi esi, hWnd, uMsg, wParam, lParam ;局部变量的定义:local 变量名:类型 @约定指局部变量 _约定指全局变量 local @stPs:PAINTSTRUCT local @stRect:RECT local @hDc mov eax, uMsg ;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> .if eax == WM_PAINT invoke BeginPaint, hWnd, addr @stPs mov @hDc, eax ;函数的返回值是放在eax里面的 invoke GetClientRect, hWnd, addr @stRect invoke SetTextColor, @hDc, Blue invoke SetBkMode, @hDc, TRANSPARENT invoke DrawText, @hDc, addr szText, -1,/ addr @stRect,/ DT_SINGLELINE or DT_CENTER or DT_VCENTER invoke EndPaint, hWnd, addr @stPs ;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> .elseif eax == WM_CLOSE invoke MessageBeep, MB_ICONINFORMATION invoke MessageBox, hWnd, addr szMsgBoxText, / addr szMsgBoxCaption, MB_ICONQUESTION or MB_YESNO .if eax == IDYES invoke ShellExecute, hWnd, addr szOperation,/ addr szURL, NULL, NULL, SW_SHOWNORMAL invoke DestroyWindow, hWinMain invoke PostQuitMessage, NULL .endif ;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> .else invoke DefWindowProc, hWnd, uMsg, wParam, lParam ret .endif ;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> xor eax, eax ret _ProcWinMain endp ;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> _WinMain proc local @stWndClass:WNDCLASSEX local @stMsg:MSG invoke GetModuleHandle, NULL mov hInstance, eax invoke RtlZeroMemory, addr @stWndClass, sizeof @stWndClass ;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> ; 注册窗口类 ;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> invoke LoadCursor, 0, IDC_ARROW mov @stWndClass.hCursor, eax push hInstance pop @stWndClass.hInstance mov @stWndClass.cbSize, sizeof WNDCLASSEX 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 RegisterClassEx, addr @stWndClass ;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> ; 建立并显示窗口 ;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> invoke CreateWindowEx, WS_EX_CLIENTEDGE,/ offset szClassName, offset szCaptionMain,/ WS_OVERLAPPEDWINDOW,/ 100, 100, 640, 480,/ 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 ;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> start: call _WinMain invoke ExitProcess, NULL ;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> end start