鱼C论坛

 找回密码
 立即注册
查看: 2648|回复: 7

中文乱码

[复制链接]
发表于 2014-10-8 20:00:51 | 显示全部楼层 |阅读模式
33鱼币
代码我是照着  Windows环境下32位汇编语言程序\Chapter05\Menu.asm  抄下来的,但是我自己抄的就会出现乱码,是不是要设置ASCII码?

最佳答案

查看完整内容

你是不是把代码,先写到TXT文件里面,然后再把文件改成后缀asm,如果是这样的话,编译的时候,确实会出现乱码的。我也是学WIN32汇编的,而且,编这个的时候,也出现过类似的问题,可以的话,加个好友,一起交流
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2014-10-8 20:00:52 | 显示全部楼层
你是不是把代码,先写到TXT文件里面,然后再把文件改成后缀asm,如果是这样的话,编译的时候,确实会出现乱码的。我也是学WIN32汇编的,而且,编这个的时候,也出现过类似的问题,可以的话,加个好友,一起交流
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2014-10-8 20:04:31 | 显示全部楼层
222.jpg

下面是代码
  1. <font size="1">;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
  2. ; by zp 9/25
  3. ;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
  4.                 .386
  5.                 .model flat, stdcall        ;flat平坦模式,stdcall windows调用方法的方式
  6.                 option casemap :none        ;区分大小写
  7. ;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
  8. ; Include 文件定义
  9. ;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
  10. include         windows.INC         ;包含windows定义的一些函数声明
  11. include         user32.INC
  12. includelib        user32.lib        ;告诉程序要去哪里找这些函数,并不会包含进来
  13. include                kernel32.INC
  14. includelib         kernel32.lib
  15. ;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
  16. ; Equ 等值定义
  17. ;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
  18. ICO_ZPTB        equ        100h        ;图标
  19. ;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
  20. IDM_ZCD                equ        2000h        ;主菜单id
  21. IDA_JSJ                equ        2000h        ;加速键ID
  22. IDM_WJ1                equ        2101h       
  23. IDM_WJ2                equ        2102h       
  24. IDM_WJ3                equ        2103h       
  25. IDM_WJ4                equ        2104h       
  26. IDM_WJ5                equ        2105h       
  27. IDM_WJ6                equ        2106h       
  28. IDM_WJ7                equ        2107h       
  29. IDM_WJ8                equ        2108h       
  30. ; 下面都是文件查看子菜单id
  31. IDM_CK1                equ        2201h       
  32. IDM_CK2                equ        2202h       
  33. IDM_CK3                equ        2203h       
  34. IDM_CK4                equ        2204h       
  35. IDM_CK5                equ        2205h       
  36. IDM_CK6                equ        2206h       
  37. IDM_CK7                equ        2207h       
  38. IDM_CK8                equ        2208h       
  39. ; 下面都是文件关闭子菜单id
  40. IDM_GB                equ        2222
  41. ;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
  42. ; 数据段(全局变量一般定义在这里)
  43. ;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
  44.                 .data?        ;表示可以不初始值,只是告诉程序我这里需要这些数据,到时候用到在分配空间
  45. hInstance        DD        ?        ;h表示这个数据是句柄,当然只是这个书上的数据一般都是这么定义的
  46. hWinMain        DD        ?
  47. hMenu                DD        ?
  48. hSubMenu        DD        ?
  49. ;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
  50. ; 数据段(这里一般是一常量)
  51. ;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
  52.                 .const
  53. szClassName        DB        'Menu Example',0        ;字符串用0结尾
  54. szCaptionMain        DB         'Menu',0
  55. szMenuHelp        DB         '帮助主题(&H)',0
  56. szMenuAbout        DB         '关于本程序(&A)...',0
  57. szCaption        DB         '菜单选择',0
  58. szFormat        DB        '您选择了菜单命令:%08x',0
  59. ;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
  60.                 .code
  61. ;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
  62. _DisplayMenuItem        proc        _dwCommandID
  63.         local @szBuffer[256]:BYTE

  64.         PUSHAD
  65.         invoke wsprintf,\
  66.                 addr @szBuffer,\        ;输出缓冲区
  67.                 addr szFormat,\                ;格式字符串
  68.                 _dwCommandID                ;需要输出的参数
  69.         invoke MessageBox,\
  70.                 hWinMain,\                ;哪个窗口的消息框
  71.                 addr @szBuffer,\        ;显示的内容
  72.                 offset szCaption,\        ;消息框的标题
  73.                 MB_OK                        ;消息框上面的按钮
  74.         POPAD
  75.         RET  
  76. _DisplayMenuItem        endp
  77. ;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
  78. _Quit        proc
  79.         ;发送WM_DESTROY 消息和 WM_NCDESTROY 销毁指定窗口,成功返回非0值,失败返回0
  80.         invoke        DestroyWindow,hWinMain
  81.         ;该函数向系统表明有个线程有终止请求。通常用来响应WM_DESTROY消息。
  82.         ;参数指定应用程序退出代码。此值被用作消息WM_QUIT的wParam参数。
  83.         invoke        PostQuitMessage,NULL
  84. _Quit        endp
  85. ;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
  86. ;uses EBX,EDI,ESI 保存这几个值,push  pop
  87. _ProcWinMain        proc        uses EBX EDI ESI hWnd,uMsg,wParam,lParam
  88.         local        @stPos:POINT        ;x 和 y 的坐标
  89.         local        @hSysMenu

  90.         MOV EAX,uMsg
  91.         .IF EAX ==  WM_CREATE        ;由CreateWindowEx 函数返回之前发送
  92.                 ;获得指定菜单已激活的子菜单句柄,参数1 指定菜单,参数2 子菜单的索引
  93.                 INVOKE        GetSubMenu,hMenu,1
  94.                 MOV hSubMenu,EAX
  95. ;********************************************************************
  96. ; 在系统菜单中添加菜单项
  97. ;********************************************************************
  98.                 ;修改或者访问窗口菜单,参数2为 NULL 则获得窗口菜单的句柄
  99.                 invoke        GetSystemMenu,hWnd,FALSE
  100.                 MOV @hSysMenu,EAX
  101.                 invoke        AppendMenu,@hSysMenu,MF_SEPARATOR,0,NULL
  102.                 invoke        AppendMenu,@hSysMenu,0,IDM_WJ3,offset szMenuHelp
  103. ;********************************************************************
  104.         ;由子窗口或者快捷键产生则通知码为1,由菜单产生通知码为0。
  105.         .elseif EAX ==        WM_COMMAND               
  106.                 invoke        _DisplayMenuItem,wParam
  107.                 MOV EAX,wParam
  108.                 MOVZX        EAX,AX
  109.                 PUSH EAX
  110.                 .IF EAX ==  IDM_GB
  111.                         CALL         _Quit
  112.                 .elseif EAX >= IDM_WJ1 && EAX <= IDM_WJ4
  113.                         MOV EBX,EAX
  114.                         ;获得指定菜单里的某个菜单项的状态,ebx:菜单项,MF_BYCOMMAND定位的方法
  115.                         ;MF_CHECKED选中,MF_DISABLED禁用,MF_GRAYED灰化
  116.                         invoke        GetMenuState,hMenu,EBX,MF_BYCOMMAND
  117.                         .IF EAX ==  MF_CHECKED        ;是否选中
  118.                                 MOV EAX,MF_UNCHECKED
  119.                         .else
  120.                                 MOV EAX,MF_CHECKED
  121.                         .endif
  122.                         ;设置指定菜单的某个菜单项的状态,返回设置之前的状态
  123.                         invoke        CheckMenuItem,hMenu,EBX,EAX
  124.                 .elseif EAX >= IDM_WJ5 && EAX <= IDM_WJ8
  125.                         ;设置指定菜单的某个菜单项的状态和标志,以及清除范围内所有菜单项的状态和标志
  126.                         invoke        CheckMenuRadioItem,hMenu,IDM_WJ5,IDM_WJ8,EAX,MF_BYCOMMAND
  127.                 .endif
  128.                 POP EAX

  129.                 .IF        EAX ==        IDM_WJ8        ;如果选择了小图标菜单项,就禁用
  130.                                 invoke        EnableMenuItem,hMenu,IDM_WJ8,MF_DISABLED
  131.                 .endif
  132. ;********************************************************************
  133.         .elseif EAX ==         WM_SYSCOMMAND        ;处理系菜单
  134.                 MOV EAX,wParam
  135.                 MOVZX EAX,AX
  136.                 .IF EAX == IDM_WJ3
  137.                         invoke        _DisplayMenuItem,wParam
  138.                 .else
  139.                         invoke        DefWindowProc,hWnd,uMsg,wParam,lParam
  140.                 .endif
  141. ;********************************************************************
  142.         .elseif EAX ==        WM_RBUTTONDOWN
  143.                 invoke        GetCursorPos,addr @stPos
  144.                 invoke        TrackPopupMenu,hSubMenu,TPM_LEFTALIGN,@stPos.x,@stPos.y,NULL,hWnd,NULL
  145. ;********************************************************************               
  146.         .elseif        eax ==        WM_CLOSE
  147.                 call        _Quit
  148. ;********************************************************************
  149.         .else
  150.                 invoke        DefWindowProc,hWnd,uMsg,wParam,lParam
  151.                 ret
  152.         .endif
  153. ;********************************************************************
  154.         xor        eax,eax
  155.         ret
  156. _ProcWinMain        endp
  157. ;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
  158. _WinMain        proc        ;proc  自定义子程序的开始标志
  159.         local        @stWndClass:WNDCLASSEX        ;WNDCLASSEX窗口类的数据结构
  160.         local         @stMsg:MSG                ;消息类的数据结构
  161.         local        @hAccelerator               

  162.         invoke         GetModuleHandle,NULL        ;返回指定模块的句柄,参数NULL返回本模块句柄,句柄存放在EAX
  163.         MOV hInstance,EAX
  164.         invoke        LoadMenu,hInstance,IDM_ZCD        ;为指定模块加载指定菜单资源,可以用指定菜单名的指针作为参数,也可以使用菜单id,成功则返回,菜单句柄
  165.         MOV hMenu,EAX
  166.         invoke         LoadAccelerators,hInstance,IDA_JSJ        ;加载加速键
  167.         MOV @hAccelerator,EAX
  168. ;********************************************************************
  169. ; 注册窗口类
  170. ;********************************************************************
  171.         ;填充一块内存区域,参数1:首地址 ,参数2:填充的大小     
  172.         invoke RtlZeroMemory,addr @stWndClass,sizeof @stWndClass       
  173.         invoke LoadIcon,hInstance,ICO_ZPTB        ;加载图标,返回图标句柄
  174.         MOV @stWndClass.hIcon,EAX                 ;图标句柄
  175.         MOV @stWndClass.hIconSm,EAX                 ;设置小图标
  176.         invoke LoadCursor,0,IDC_ARROW                ;加载光标资源,返回光标句柄
  177.         MOV @stWndClass.hCursor,EAX
  178.         PUSH         hInstance
  179.         POP @stWndClass.hInstance
  180.         MOV @stWndClass.cbSize,sizeof WNDCLASSEX;设置WNDCLASSEX的大小
  181.         MOV @stWndClass.style,CS_HREDRAW OR CS_VREDRAW        ;设置窗口的风格
  182.         MOV @stWndClass.lpfnWndProc,offset _ProcWinMain        ;指该类对应的窗口过程
  183.         MOV @stWndClass.hbrBackground,COLOR_WINDOW + 1        ;背面画刷
  184.         MOV @stWndClass.lpszClassName,offset szClassName;指定类名叫什么
  185.         invoke        RegisterClassEx,addr @stWndClass        ;开始注册
  186. ;********************************************************************
  187. ; 建立并显示窗口
  188. ;********************************************************************
  189.         invoke        CreateWindowEx,        \       
  190.                 WS_EX_CLIENTEDGE,\        ;窗口的扩展风格
  191.                 offset szClassName,\        ;指向注册类名的指针
  192.                 offset szCaptionMain,\        ;指向窗口名称的指针
  193.                 WS_OVERLAPPEDWINDOW,\        ;窗口风格
  194.                 100,100,400,300,NULL,hMenu,hInstance,NULL                        ;指向窗口的创建数据
  195.         MOV hWinMain,EAX                 ;注册成功返回窗口句柄,否则返回NULL
  196.         ;显示窗口,参数1,要显示窗口的句柄,参数2:还原窗口的位置
  197.         invoke        ShowWindow,hWinMain,SW_SHOWNORMAL

  198.         ;如果更新的区域不为空,函数则发送WM_PAINT 消息到该窗口的窗口过程
  199.         invoke        UpdateWindow,hWinMain       
  200. ;********************************************************************
  201. ; 消息循环
  202. ;********************************************************************
  203.         .while TRUE
  204.                 ;如果函数取得WM_QUIT之外的其他消息,返回非零值。
  205.                 ;如果函数取得WM_QUIT消息,返回值是零。如果出现了错误,返回值是-1。
  206.                 invoke        GetMessage,\       
  207.                         addr @stMsg,\        ;该结构从线程的消息队列里接收消息信息
  208.                         NULL,\                ;;取得其消息的窗口的句柄
  209.                         0,\                ;指定被检索的最小消息值的整数。
  210.                         0                ;指定被检索的最大消息值的整数。

  211.                 .break        .IF EAX == 0        ;0消息就代表退出
  212.                 ;该函数将一个WM-DEYDOUN或WM-SYSDEYDOWN消息翻译或一个WM-COMMAND或
  213.                 ;WM-SYSCOMMAND消息(如果在给定的加速键表中有该键的入口),
  214.                 ;然后将WM-COMMAND或WM-SYSCOMMAND消息直接送到相应的窗口处理过程。
  215.                 invoke        TranslateAccelerator,hWinMain,@hAccelerator,addr @stMsg
  216.                 .IF EAX == 0
  217.                         ;当消息是键盘消息,则转换成对应的ASCII码,然后插入WM_CHAR
  218.                         ;WM_SYSCHAR到消息队列,如果不是键盘消息则不处理
  219.                         invoke TranslateMessage,addr @stMsg

  220.                         ;将消息发送给操作系统,由操作系统来调用我们指定的窗口过程
  221.                         invoke DispatchMessage,addr @stMsg
  222.                 .endif
  223.         .endw
  224.         RET
  225. _WinMain        endp
  226.        

  227. start:
  228.         CALL        _WinMain                ;带下划线的函数是指自己写的
  229.         invoke        ExitProcess,NULL        ;关闭进程,参数NULL是代表 关闭当前进程
  230. ;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
  231.         end start</font>
复制代码
  1. //>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
  2. #include        <resource.h>        //resource 这个应该是一些菜单和光标等的定义
  3. //>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
  4. #define                ICO_ZPTB        0x100        //图标
  5. //>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
  6. #define                IDM_ZCD                0x2000        //菜单
  7. #define                IDA_JSJ                0x2000        //加速键
  8. //>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
  9. //下面都是文件子菜单id
  10. #define                IDM_WJ1                0x2101       
  11. #define                IDM_WJ2                0x2102       
  12. #define                IDM_WJ3                0x2103       
  13. #define                IDM_WJ4                0x2104       
  14. #define                IDM_WJ5                0x2105       
  15. #define                IDM_WJ6                0x2106       
  16. #define                IDM_WJ7                0x2107       
  17. #define                IDM_WJ8                0x2108       
  18. //下面都是文件查看子菜单id
  19. #define                IDM_CK1                0x2201       
  20. #define                IDM_CK2                0x2202       
  21. #define                IDM_CK3                0x2203       
  22. #define                IDM_CK4                0x2204       
  23. #define                IDM_CK5                0x2205       
  24. #define                IDM_CK6                0x2206       
  25. #define                IDM_CK7                0x2207       
  26. #define                IDM_CK8                0x2208       
  27. //下面都是文件关闭子菜单id
  28. #define                IDM_GB                0x2222
  29. //>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
  30. ICO_ZPTB        ICON        "Main.ico"        //定义图标
  31. //>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
  32. IDM_ZCD                menu        discardable        //定义菜单
  33. BEGIN
  34.         POPUP        "WJ(&Q)"                        //&是为了给F加个下划线
  35.         BEGIN
  36.                 MENUITEM        "WJ1",        IDM_WJ1
  37.                 MENUITEM        "WJ2",        IDM_WJ2
  38.                 MENUITEM        "WJ3",        IDM_WJ3
  39.                 MENUITEM        "WJ4",        IDM_WJ4
  40.                 MENUITEM        SEPARATOR        //这个菜单是个  分割线
  41.                 MENUITEM        "WJ5",        IDM_WJ5
  42.                 MENUITEM        "WJ6",        IDM_WJ6
  43.                 MENUITEM        "WJ7",        IDM_WJ7
  44.                 MENUITEM        "WJ8",        IDM_WJ8
  45.         END

  46.         POPUP        "CK(&W)"
  47.         BEGIN
  48.                 MENUITEM        "CK1",        IDM_CK1,        INACTIVE        //禁用的菜单
  49.                 MENUITEM        "CK2",        IDM_CK2,        GRAYED                //灰化的菜单
  50.                 MENUITEM        "CK3",        IDM_CK3
  51.                 MENUITEM        "CK4",        IDM_CK4
  52.                 MENUITEM        SEPARATOR        //这个菜单是个  分割线
  53.                 POPUP                "CK5"
  54.                 BEGIN
  55.                         MENUITEM        "CK6",        IDM_CK6
  56.                         MENUITEM        "CK7",        IDM_CK7
  57.                         MENUITEM        "CK8",        IDM_CK8
  58.                 END
  59.                
  60.         END

  61.         MENUITEM        "GB",        IDM_GB
  62. END
  63. //>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
  64. IDA_JSJ                ACCELERATORS
  65. BEGIN
  66.         VK_F1,        IDM_WJ1,VIRTKEY                //VIRTKEY这个表示这个加速键一个键码
  67.         "^p",        IDM_WJ1                                //ctrl+p
  68.         "O",        IDM_WJ2                                //shift+o 因为键盘上的o是小写的,等下又测试
  69.         "o",        IDM_WJ3,ALT                        //lat+o
  70.         98,                IDM_WJ4,ASCII                                //b(字符c的Ascii码为98)               
  71.         66,                IDM_WJ5,ASCII                                //shift+b(字符c的Ascii码为98)               
  72. END




































































复制代码




小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2014-10-10 20:17:59 | 显示全部楼层
这种乱码是文本编码问题吧
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2014-10-12 03:14:06 | 显示全部楼层
那课的?我可以帮你看下
用RadASM吧,没有好的开发环境,学汇编会搞崩溃人的
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2014-10-12 13:17:29 | 显示全部楼层
aa05001 发表于 2014-10-12 08:49
你是不是把代码,先写到TXT文件里面,然后再把文件改成后缀asm,如果是这样的话,编译的时候,确实会出现乱 ...

  没有啊,我就是直接用EverEdit这个编辑工具来写代码的。
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2014-10-12 13:18:06 | 显示全部楼层
aa05001 发表于 2014-10-12 08:49
你是不是把代码,先写到TXT文件里面,然后再把文件改成后缀asm,如果是这样的话,编译的时候,确实会出现乱 ...

  加我qq吧,  方便点,加的时候注明一下:312154421
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

头像被屏蔽
发表于 2014-11-1 00:07:52 | 显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-7-3 12:47

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表