Micheal 发表于 2013-11-18 18:00:22

Win32汇编,窗口菜单文字乱码,不知道原因,求解释

.386
                .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: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      




1144290241 发表于 2013-11-18 18:07:27

你看看你文件保存时候的编码,也有可能是这里出问题了………………

Micheal 发表于 2013-11-18 18:10:56

1144290241 发表于 2013-11-18 18:07 static/image/common/back.gif
你看看你文件保存时候的编码,也有可能是这里出问题了………………

正常记事本保存啊,朋友,以前也弄过相同的,没有出现过问题的。这个就出问题了,着实不知道原因

1144290241 发表于 2013-11-18 18:20:31

Micheal 发表于 2013-11-18 18:10 static/image/common/back.gif
正常记事本保存啊,朋友,以前也弄过相同的,没有出现过问题的。这个就出问题了,着实不知道原因

不知道。我遇到过的问题,就是记事本的默认保存编码被改掉了。结果程序读进去的就是乱码了………………

Micheal 发表于 2013-11-18 18:22:12

1144290241 发表于 2013-11-18 18:20 static/image/common/back.gif
不知道。我遇到过的问题,就是记事本的默认保存编码被改掉了。结果程序读进去的就是乱码了………………

朋友,那你试着复制下,然后按照你得方式编译,运行,看看结果。给我说下,好不好

Micheal 发表于 2013-11-18 18:23:28

1144290241 发表于 2013-11-18 18:20 static/image/common/back.gif
不知道。我遇到过的问题,就是记事本的默认保存编码被改掉了。结果程序读进去的就是乱码了………………

朋友你试着把这段代码复制,编译下,看看结果。给我说下,好吗:handshake

1144290241 发表于 2013-11-18 18:34:03

Micheal 发表于 2013-11-18 18:23 static/image/common/back.gif
朋友你试着把这段代码复制,编译下,看看结果。给我说下,好吗

实际上我也想来着。我好久没看asm的了,现在在考研……………上鱼c只是习惯………………

Micheal 发表于 2013-11-18 18:40:53

1144290241 发表于 2013-11-18 18:34 static/image/common/back.gif
实际上我也想来着。我好久没看asm的了,现在在考研……………上鱼c只是习惯………………

:handshake哦,哦   还是谢谢你哈。有学了点儿。保存的时候编码的选择

1144290241 发表于 2013-11-18 18:44:19

Micheal 发表于 2013-11-18 18:40 static/image/common/back.gif
哦,哦   还是谢谢你哈。有学了点儿。保存的时候编码的选择

没事,共同学习

夜★霜寒 发表于 2013-11-18 18:47:01

支持楼主,赞一个

Micheal 发表于 2013-11-20 15:45:41

夜★霜寒 发表于 2013-11-18 18:47 static/image/common/back.gif
支持楼主,赞一个

{:5_103:}多来点儿人回复啊

City_of_the_sky 发表于 2013-11-22 04:36:02

重新复制下,然后新建,粘贴~我也碰到过这个问题:sad

Micheal 发表于 2013-11-22 21:58:45

City_of_the_sky 发表于 2013-11-22 04:36 static/image/common/back.gif
重新复制下,然后新建,粘贴~我也碰到过这个问题

{:2_34:}这也行?

Micheal 发表于 2013-11-22 22:21:08

{:2_35:}多谢各位亲,,本人已找到是什么地方出问题了、。谢谢帮顶了

City_of_the_sky 发表于 2013-11-25 08:01:16

Micheal 发表于 2013-11-22 21:58 static/image/common/back.gif
这也行?

不贴答案?

ヽ朝暮是安然 发表于 2013-11-26 12:48:41

看不当明白!~
页: [1]
查看完整版本: Win32汇编,窗口菜单文字乱码,不知道原因,求解释