注册 登录
编程论坛 汇编论坛

问个很基础的问题,怎么定义unicode,是编译的时候messageboxex的地址编译成messageboxexw的地址

hcksfch 发布于 2012-09-30 21:28, 2294 次点击
,如题,定义unicode的代码不会写,自己反汇编后总是messageboxexa

[ 本帖最后由 hcksfch 于 2012-9-30 21:30 编辑 ]
29 回复
#2
zklhp2012-09-30 21:29
最简单的方法是直接调用相应的W版本的API win32汇编中对unicode的支持比较差 主要是编译器的unicode的支持比较差
#3
hcksfch2012-09-30 21:32
回复 2楼 zklhp
用user32.inc里的定义和条件汇编实现要怎么用?



[ 本帖最后由 hcksfch 于 2012-9-30 21:37 编辑 ]
#4
zklhp2012-09-30 21:37
以下是引用hcksfch在2012-9-30 21:32:24的发言:

,用messageboxex,怎么实现user32.inc里的定义和条件汇编怎么用?
http://www.

给个例子罢 以前写的

调用不难 直接invoke 相应的W版本API就可以了 麻烦的是 字符串要用unicode 可汇编的编译器不支持定义这个 虽然有宏可以定义英文的unicode 但总是不好 所以 非要用的话可以用其他软件转换后插入。。
#5
hcksfch2012-09-30 21:43
回复 4楼 zklhp
我的意思是:我不会用通过定义unicode来使编译器将messageboxex自动转换为messageboxexw,不考虑转换后乱码。masm32编译器,
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
; Sample code for < Win32ASM Programming 3rd Edition>
; by 罗云彬, http://www.
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
; Test.asm
; 编程环境测试代码
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
; 使用 nmake 或下列命令进行编译和链接:
; ml /c /coff Test.asm
; rc Test.rc
; Link /subsystem:windows Test.obj Test.res
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
        .386
        .model flat,stdcall
        option casemap:none
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
; Include 文件定义
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
include        windows.inc
include        user32.inc
includelib    user32.lib
include        kernel32.inc
includelib    kernel32.lib
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
; 数据段
__UNICODE__=1  ;这个代码没用
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
        .const
szCaption    db    '恭喜',0
szText        db    '当您看到这个信息的时候,您已经可以编译Win32汇编程序了!',0
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
; 代码段
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
        .code
start:
        invoke    MessageBoxEx,NULL,offset szText,offset szCaption,MB_OK,NULL
        invoke    ExitProcess,NULL
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
        end    start


[ 本帖最后由 hcksfch 于 2012-9-30 21:46 编辑 ]
#6
zklhp2012-09-30 21:49
不知道你了解不了解win32汇编的实质

win32汇编的编译器是微软的MASM 其他的头文件 库等大部分是网友做的 以MASM32包的形式提供

问题就是这些头文件不是官方的 所以问题很大 有些地方遵循了有UNICODE用W版API 有些地方直接写死了只能用ASCII的版本 所以我告诉你 最好直接用W版

例子 MASMPlus带的头文件

MessageBoxExA PROTO :DWORD,:DWORD,:DWORD,:DWORD,:DWORD
MessageBoxEx equ <MessageBoxExA>

MessageBoxExW PROTO :DWORD,:DWORD,:DWORD,:DWORD,:DWORD

看到了么 这里 只能用W来调用 你写神马UNICODE都没用 这里写死了

也对 因为MASM最起码在6.x的版本是不支持unicode的定义的 而高版本MASM由于不支持高级宏所以开发起来不方便 虽然可以用宏来支持英语的unicode定义 但对于中文貌似没有好的方法


[ 本帖最后由 zklhp 于 2012-9-30 21:50 编辑 ]
#7
zklhp2012-09-30 21:51
很抱歉我能说的就这些了 如果您不满意可以搜索一下 祝好运
#8
hcksfch2012-09-30 21:52
回复 6楼 zklhp
这是masm32中的定义,我该怎么用呢,多谢了
程序代码:
MessageBoxA PROTO STDCALL :DWORD,:DWORD,:DWORD,:DWORD
IFNDEF __UNICODE__
  MessageBox equ <MessageBoxA>
ENDIF
MessageBoxExA PROTO STDCALL :DWORD,:DWORD,:DWORD,:DWORD,:DWORD
IFNDEF __UNICODE__
  MessageBoxEx equ <MessageBoxExA>
ENDIF
MessageBoxExW PROTO STDCALL :DWORD,:DWORD,:DWORD,:DWORD,:DWORD
IFDEF __UNICODE__
  MessageBoxEx equ <MessageBoxExW>
ENDIF
#9
zklhp2012-09-30 21:55
简单搜了一下 貌似新版的MASM32包支持这个了

UNICODE Support
The MASM32 SDK has a completely new include file system that supports either ASCII or UNICODE by the inclusion of an equate, __UNICODE__ . Two new macro systems support UNICODE text that can be used in much the same manner as embedded ASCII text.

我用的比较老 不支持也正常

可惜啊 中文的问题很难解决呀
#10
hcksfch2012-09-30 21:58
罗云彬的win32刚看到开头就蒙了
#11
zklhp2012-09-30 21:59
以下是引用hcksfch在2012-9-30 21:52:51的发言:

这是masm32中的定义,我该怎么用呢,多谢了MessageBoxA PROTO STDCALL :DWORD,:DWORD,:DWORD,:DWORD
IFNDEF __UNICODE__
  MessageBox equ  
ENDIF
MessageBoxExA PROTO STDCALL :DWORD,:DWORD,:DWORD,:DWORD,:DWORD
IFNDEF __UNICODE__
  MessageBoxEx equ  
ENDIF
MessageBoxExW PROTO STDCALL :DWORD,:DWORD,:DWORD,:DWORD,:DWORD
IFDEF __UNICODE__
  MessageBoxEx equ  
ENDIF

对于这个 应该用

__UNICODE__ equ 1

等来实现 等号和equ不大一样

即使这样我还是不大看好这个特性 中文支持是硬伤
#12
zklhp2012-09-30 22:00
以下是引用hcksfch在2012-9-30 21:58:06的发言:

罗云彬的win32刚看到开头就蒙了

而且罗云彬的书没提这个unicode的事 为啥没提呢 这个问题确实是个比较麻烦的事 最大的麻烦在于编译器都不支持。。
#13
hcksfch2012-09-30 22:01
回复 9楼 zklhp
那要怎么用,我不知道怎么定义unicode
#14
zklhp2012-09-30 22:02
如果你是初学者 暂时不要考虑这个问题了 这个问题确实是个比较麻烦的事

如果非要解决 要靠微软的编译器完美解决是不现实的了 JWASM完全兼容MASMv6的高级宏 支持x64 开源 是个比较好的选择 可惜忙于搬砖也懒得研究了

祝楼主好运
#15
zklhp2012-09-30 22:04
以下是引用hcksfch在2012-9-30 22:01:17的发言:

那要怎么用,我不知道怎么定义unicode

没看我上面说的么 编译器本身不支持 要实现要么像我上面那个例子一样用外部工具转换后以db的形式放进去 要么用宏 宏有很多 缺点是不支持中文
#16
hcksfch2012-09-30 22:17
以下是引用zklhp在2012-9-30 21:59:42的发言:


对于这个 应该用

__UNICODE__ equ 1

等来实现 等号和equ不大一样

即使这样我还是不大看好这个特性 中文支持是硬;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
; Sample code for < Win32ASM Programming 3rd Edition>
; by 罗云彬, http://www.
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
; Test.asm
; 编程环境测试代码
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
; 使用 nmake 或下列命令进行编译和链接:
; ml /c /coff Test.asm
; rc Test.rc
; Link /subsystem:windows Test.obj Test.res
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
        .386
        .model flat,stdcall
        option casemap:none
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
; Include 文件定义
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
include        windows.inc
include        user32.inc
includelib    user32.lib
include        kernel32.inc
includelib    kernel32.lib
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
; 数据段
__UNICODE__ equ 1
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
        .const
szCaption    db    '恭喜',0
szText        db    '当您看到这个信息的时候,您已经可以编译Win32汇编程序了!',0
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
; 代码段
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
        .code
start:
        invoke    MessageBoxEx,NULL,offset szText,offset szCaption,MB_OK,NULL
        invoke    ExitProcess,NULL
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
        end    start

这个不管用,;结果ollydbg看的还是messageboxexa,而且运行结果没乱码。
#17
有容就大2012-09-30 22:28
换个编译器试试。。。
#18
zklhp2012-09-30 22:30
是不是必须把那个玩意放include之前啊
#19
hcksfch2012-09-30 22:34
回复 18楼 zklhp
放在前面也不管用
ml版本,6.14.8444

[ 本帖最后由 hcksfch 于 2012-9-30 22:39 编辑 ]
#20
hcksfch2012-09-30 22:37
回复 17楼 有容就大
不会呀,我菜鸟一个
#21
hcksfch2012-09-30 22:45
要不你们把代码复制过去自己试试,是不是我的编译器设置错了
#22
有容就大2012-10-01 00:44
你看到结果了吗 ?去掉了那个 编译运行的
只有本站会员才能查看附件,请 登录



#23
zklhp2012-10-01 10:53
程序代码:


.386
.model flat, stdcall
option casemap :none

include windows.inc
include user32.inc
include kernel32.inc
include masm32.inc

includelib user32.lib
includelib kernel32.lib
includelib masm32.lib
include macro.asm

__UNICODE__ equ 1

.data?
    buffer    db 100 dup(?)
   
.CODE
START:
   
    IFNDEF __UNICODE__
        int 3h
    ENDIF
    invoke StdOut,CTXT("Hello World!")

    ;暂停显示,回车键关闭
    invoke StdIn,addr buffer,sizeof buffer
    invoke ExitProcess,0
   
end START


上面的这个是可以的 你写一个类似的代码实验一下是不是编译器的问题 我没有新版的MASM32包没法试了
#24
hcksfch2012-10-02 00:15
回复 22楼 有容就大
看到了,此时调用的是messageboxexa;调用messageboxexw时应该显示乱码。
#25
hcksfch2012-10-02 00:44
回复 23楼 zklhp
程序代码:
        .386
        .model flat,stdcall
        option casemap:none
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
;
Include 文件定义
;
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
include        windows.inc
include        user32.inc
includelib    user32.lib
include        kernel32.inc
includelib    kernel32.lib
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
;
数据段
__UNICODE__ equ 1
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
        .const
szCaption    db    '恭喜',0
szText        db    '当您看到这个信息的时候,您已经可以编译Win32汇编程序了!',0
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
;
代码段
;
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
        .code
start:
                IFDEF __UNICODE__
        MessageBoxEx equ <MessageBoxExW>
        ENDIF
   
        invoke    MessageBoxEx,NULL,offset szText,offset szCaption,MB_OK,NULL
        invoke    ExitProcess,NULL
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
        end    start
这个代码可以将messageboxex变为messageboxexw
似乎user32.inc里的条件汇编不能用

[ 本帖最后由 hcksfch 于 2012-10-2 00:54 编辑 ]
#26
hcksfch2012-10-02 01:22
以下是引用zklhp在2012-9-30 22:30:29的发言:

是不是必须把那个玩意放include之前啊

这个正确
#27
水哥2012-10-03 18:50
;***********  多字节转宽字节  ********  
;   作用:将多字节字符串转为宽字节 pMText指向多字节串指针 pWText指向宽字节缓存指针
;**************************************   
 M2W proc        pMText:LPCSTR, pWText:LPWSTR
                      local   mLen:dword,wLen:dword
                      invoke  lstrlen,pMText
                     add      eax,1
                     shl        eax,1
                     mov     wLen,eax
                      invoke  MultiByteToWideChar,CP_ACP, 0, pMText, -1, NULL, 0
                      mov   mLen,eax
                      .if     wLen<eax
                          xor  eax,eax
                          ret
                      .endif
                     invoke  MultiByteToWideChar,CP_ACP, 0, pMText, -1, pWText,mLen
                     xor   eax,eax
                     inc   eax
       ret
 M2W endp
送你个俺写的多字节转宽字节的子过程,用UNICODE的API用的着
#28
zklhp2012-10-03 18:58
动态转 很好 可是这和调用ASCII版本的让系统自动转有啥区别呢 那还不如直接用ASCII的呢、、、
#29
水哥2012-10-03 19:03
64位系统的好些东西都得用UNICOD的API 没办法,随用随转
#30
zklhp2012-10-03 19:07
64位系统恐怕得考虑用新的编译器了。。
1