|  | 
 
| 
.386
x
马上注册,结交更多好友,享用更多功能^_^您需要 登录 才可以下载或查看,没有账号?立即注册  .model flat,stdcall
 option casemap:none
 ;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
 ; Include 文件定义
 ;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
 include                windows.inc
 include                user32.inc
 includelib        user32.lib
 include                kernel32.inc
 includelib        kernel32.lib
 ;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
 ;Equ        等值定义
 ;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
 ICO_MAIN        equ                1000h        ;图标
 IDM_MAIN        equ                2000h        ;菜单
 IDA_MAIN        equ                3000h        ;加速键
 IDM_NEW                equ                2001h
 IDM_OPEN        equ                2002h
 IDM_SAVE        equ                2003h
 IDM_SAVEAS        equ                2004h
 IDM_PRINT        equ                2005h
 IDM_EXIT        equ                2006h
 IDM_HELP        equ                2007h
 IDM_ABOUT        equ                2008h
 
 ;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
 ; 数据段
 ;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
 .data?
 hInstance        dd                ?
 hWinMain        dd                ?
 hMenu                dd                ?
 hSubMenu        dd                ?
 ;数据段
 ;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
 .const
 szClassName                db        'Menu Example',0
 szCaptionMain        db        'Assmbly',0
 szMenuHelp                db        '帮助主题(&H)...',0
 szMenuAbout                db        '关于本程序(&A)...',0
 szCaption                db        '窗口',0
 szFormat                db        '你选择的菜单命令:%08x',0
 ;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
 ; 代码段
 ;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
 .code
 _DisplayMenuItem        proc        _dwCommandID
 local        @szBuffer[256]:byte
 pushad
 invoke        wsprintf,addr @szBuffer,addr szFormat,_dwCommandID
 invoke        MessageBox,hWinMain,addr @szBuffer,offset        szCaption,MB_OK
 popad
 ret
 _DisplayMenuItem        endp
 ;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
 _Quit        proc
 invoke        DestroyWindow,hWinMain
 invoke        PostQuitMessage,NULL
 ret
 _Quit        endp
 
 ;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
 ; 窗口过程
 ;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
 _ProcWinMain        proc        uses ebx edi esi hWnd,uMsg,wParam,lParam
 local        @stPos:POINT
 local        @hSysMenu
 
 
 mov        eax,uMsg
 ;********************************************************************
 .if        eax ==        WM_CREATE
 invoke        GetSubMenu,hMenu,1
 mov hSubMenu,eax
 ;在系统菜单中添加菜单项
 invoke        GetSystemMenu,hWnd,FALSE
 mov        @hSysMenu,eax
 invoke        AppendMenu,@hSysMenu,MF_SEPARATOR,0,NULL
 invoke        AppendMenu,@hSysMenu,0,IDM_HELP,offset szMenuHelp
 invoke        AppendMenu,@hSysMenu,0,IDM_ABOUT,offset        szMenuAbout
 ;处理菜单和加速键消息
 .elseif        eax        ==        WM_COMMAND
 invoke        _DisplayMenuItem,wParam
 mov eax,wParam
 movzx        eax,ax
 .elseif        eax        ==        IDM_EXIT
 call        _Quit
 
 
 ;********************************************************************
 .elseif        eax ==        WM_CLOSE
 invoke        DestroyWindow,hWinMain
 invoke        PostQuitMessage,NULL
 ;********************************************************************
 .else
 invoke        DefWindowProc,hWnd,uMsg,wParam,lParam
 ret
 .endif
 
 ;********************************************************************
 xor        eax,eax
 ret
 
 _ProcWinMain        endp
 ;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
 _WinMain        proc
 local        @stWndClass:WNDCLASSEX
 local        @stMsg:MSG
 local        @hAccelerator
 
 invoke        GetModuleHandle,NULL
 mov        hInstance,eax
 invoke        LoadMenu,hInstance,IDM_MAIN
 mov hMenu,eax
 invoke        LoadAccelerators,hInstance,IDA_MAIN
 mov        @hAccelerator,eax
 ;********************************************************************
 ; 注册窗口类
 ;********************************************************************
 invoke        RtlZeroMemory,addr @stWndClass,sizeof @stWndClass
 invoke        LoadIcon,hInstance,ICO_MAIN
 mov        @stWndClass.hIcon,eax
 mov @stWndClass.hIconSm,eax
 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,600,400,\
 NULL,hMenu,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        TranslateAccelerator,hWinMain,@hAccelerator,addr        @stMsg
 
 .if        eax        ==        0
 invoke        TranslateMessage,addr @stMsg
 invoke        DispatchMessage,addr @stMsg
 .endif
 .endw
 ret
 
 _WinMain        endp
 ;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
 start:
 call        _WinMain
 invoke        ExitProcess,NULL
 ;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
 end        start
 ;这是代码,下面是资源文件
 
 #include        <resource.h>
 //定义资源
 #define        ICO_MAIN        0x1000        //图标
 #define        IDM_MAIN        0x2000        //菜单
 #define        IDA_MAIN        0x3000        //加速键
 
 //定义子子菜单项
 #define        IDM_NEW                0x2001
 #define        IDM_OPEN        0x2002
 #define        IDM_SAVE        0x2003
 #define        IDM_SAVEAS        0x2004
 #define        IDM_PRINT        0x2005
 #define        IDM_EXIT        0x2006
 #define        IDM_HELP        0x2007
 #define        IDM_ABOUT        0x2008
 
 ICO_MAIN        ICON        "main.ico"
 
 IDM_MAIN        menu        discardable
 BEGIN
 popup        "文件(&F)"
 BEGIN
 menuitem        "新建(&N)\tCtrl+N",                IDM_NEW
 menuitem        "打开(&O)...\tCtrl+O"        IDM_OPEN
 menuitem        "保存(&S)...\tCtrl+S"        IDM_SAVE
 menuitem        "另存为(&A)..."                        IDM_SAVEAS
 menuitem        separator
 menuitem        "打印(&P)...\tCtrl+P"        IDM_PRINT
 menuitem        separator
 menuitem        "退出(&X)"                                IDM_EXIT
 END
 popup        "帮助(&H)",        HELP
 BEGIN
 menuitem        "帮助主题(&H)\tF1"        IDM_HELP
 menuitem        separator
 menuitem        "关于(&A)...",        IDM_ABOUT
 END
 END
 
 IDA_MAIN        accelerators
 BEGIN
 "^N",                IDM_NEW
 "^O",                IDM_OPEN
 "^S",                IDM_SAVE
 "^P",                IDM_PRINT
 VK_F1,                IDM_HELP,        VIRTKEY
 END
 
 
 
 
 
 | 
 |