| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
共有 658 人关注过本帖
标题:【求助】关于汇编中调用API只能是ASCII版本的问题
取消只看楼主 加入收藏
非人间的雪
Rank: 1
等 级:新手上路
帖 子:3
专家分:0
注 册:2013-1-20
结帖率:100%
收藏
已结贴  问题点数:20 回复次数:2 
【求助】关于汇编中调用API只能是ASCII版本的问题
撸主昨日闲来无事看了下《windows程序设计》,里面有这么一段话“wndclass.lpszClassName = szAppName ;         
至于该字符串由ASCII字符组成或由Unicode字符组成,取决于是否定义了UNICODE标识符。

撸主突然想到在Win32汇编里,它是怎么确定用哪个版本的,于是撸主用MessageBox做下实验,写了一段代码:
程序代码:
.386
.model flat, stdcall
option casemap:none

include        windows.inc
include        user32.inc
includelib    user32.lib
include        kernel32.inc
includelib    kernel32.lib


.const
szMsgText    db    '几时心绪浑无事,得几游丝百尺长?',0
szCaption    db    '诗句',0

.code
start:
        invoke    MessageBoxA,NULL,offset szMsgText,offset szCaption,MB_OK
        mov    eax, sizeof szCaption
        .if    eax == 5
            invoke    MessageBox, NULL, NULL, NULL, MB_OK
        .endif
       
        invoke    ExitProcess,NULL

        end    start

使用eax对szCaption的长度进行判断时,撸主试了几次,惊奇的发现它的长度居然是5!中文的确是用两个byte表示了,但最后一个0仍然是一个byte!
问题有:
一、使用MessageBoxA的时候没有任何问题,但是为什么可以呢?这个不是只能处理ASCII字符串么??
二、修改下代码,使用MessageBoxW的时候就会产生乱码,为什么呢?
三、再修改一下代码,将两个字符串用DW定义,这时候编译就不能通过了:“constant value too large”,这是为什么?撸主注意到使用ml编译的时候
有个提示  ASCII build, 所有这些问题是不是都跟这个有关?

好吧,坐等各路大神解答


2013-01-20 13:33
非人间的雪
Rank: 1
等 级:新手上路
帖 子:3
专家分:0
注 册:2013-1-20
收藏
得分:0 
回复 2楼 wp231957
代码好长啊,大神,还有钩子。。。书都还没看到那呢,有短点的代码么...如果MessageBoxA能处理中文,那干嘛还弄个MessageBoxW??
的确是不明白,用db定义的中文为什么会变成两个字节的??
2013-01-20 13:53
非人间的雪
Rank: 1
等 级:新手上路
帖 子:3
专家分:0
注 册:2013-1-20
收藏
得分:0 
回复 5楼 x64asm
那大神能告诉我为什么用MessageBoxW就会乱码呢,而且ASCII版的MessageBoxA怎么分辨,当前的字符串有没有汉字?API是操作系统提供的
在独立的DLL中,编译器和连接器都不可能影响到DLL中的函数,换句话说,在独立的DLL中,MessageBoxA是不可能知道传递给它的字符串到底
是纯英文,还是混有汉字。所以它到底是怎么做到可以分辨出汉字进而将两个字节的数据解释为一个汉字的呢??
2013-01-20 23:56
快速回复:【求助】关于汇编中调用API只能是ASCII版本的问题
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.017004 second(s), 8 queries.
Copyright©2004-2025, BC-CN.NET, All Rights Reserved