WIN32汇编显示乱码问题 WSPRINTF

来源:互联网 发布:淘宝信息管理系统要求 编辑:程序博客网 时间:2024/05/19 00:38

学习了WIN32汇编都有几天了,觉得比C的WIN32好学,比较简洁,能够很好的了解WINDOWS的一些机制

 

在QQ群上也提问过了,但答的人极少(可能是问题比较简单吧),我这等菜鸟又不能理解高人们的飘逸答法。。。。郁闷

 

在网上搜到了一段比较有价值的WSPRINTF函数的说明:

 

 

 

 

在C语言中格式化字符串可以使用printf,但是在WINDOWS编程设计中却行不通了,但是却有变通的方法,那就是用 wsprintf这个函数 它的格式如下:

wsprintf(缓冲区,格式,要格式化的值);
第一个参数是字符缓冲区,后面是格式字符串,wsprintf不是将格式化结果写到标准输出,而是将其写入缓冲区中,该函数返回该字符串的长度。

比如我们想通过MessageBox来输出一个整形变量的值,可以用以下代码实现:
char szBuffer[100];
ing number=100;
wsprintf(szBuffer, “%d”,number);
MessgaeBox(NULL,szBrffer,TEXT(“格式化字符串”),0);
这个函数除了将内容格式化输出到第一个参数所提供的字符串缓冲区以外,其它功能与printf函数相同

wsprintf对应的字符串是宽字符型wchar_t,即一个字符占用2个字节的内存空间.
sprintf对应的字符串是字符类型为char,几一个字符占用1个字节的内存空间.
sprintf是用于对ASCII码的127个字符进行操作,wsprintf是对UNICODE的多语言字符进行操作.
如:
sprintf(buffer, "ascii");
wsprintf(buffer, L"unicode");

 

 

 

 

 

 

下面是我自己写的程序:

.386
.model flat,stdcall
option casemap:none

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

.data
Caption db "GetTime",0
ipFmt   db "%d",0

.data?
lpSystemTime SYSTEMTIME <>
ipOut dd ?
;ipOut dd 100 dup(?);定义100个字节的数组


.code
start:
 
invoke GetLocalTime,addr lpSystemTime
movzx eax,lpSystemTime.wYear
invoke wsprintf,addr ipOut,addr ipFmt,eax
invoke MessageBox,NULL,addr ipOut,addr Caption,MB_OK
invoke ExitProcess,NULL

end start