wsprintf 函数在WIN32 汇编中出现BUG
本帖最后由 风中醉柳 于 2014-6-22 12:11 编辑不知道是不是BUG ,不过确实存在问题........
wsprintf -语法 int wsprintf(
LPTSTRlpOut, // 输出缓冲区,最大为1024字节
LPCTSTRlpFmt, // 格式字符串
...) // 需输出的参数;
;多少个参数都可以的
自己写了个获取本地时间并显示的小程序,发现问题, 其参数有一个的话正常打印,有两个及以上就出现了问题。
申明:我定义的SYSTEMTIME 这个结构里面的时间都是对的,我将月份放在第一个参数能正常打印,其他的放进去也一样!
1.跟两个参数,第一个能正常打印,第二个乱码显示,程序不崩溃
2.跟三个参数,第一个能正常打印,第二个乱码显示,第三个乱码显示,程序崩溃
跟两个参数
跟三个参数
看看 顺便顶LZ 应该是invoke指令的问题,我反汇编了一下
00401000 <>/$68 00304000 PUSH 1.00403000 ; /pLocaltime = 1.00403000
00401005 |.E8 42000000 CALL <JMP.&kernel32.GetLocalTime> ; \GetLocalTime
0040100A 6A 00 PUSH 0
0040100C |.66:FF35 02304>PUSH WORD PTR DS:
00401013 6A 00 PUSH 0
00401015 |.66:FF35 00304>PUSH WORD PTR DS: ; |<%d> = 0
0040101C |.68 10344000 PUSH 1.00403410 ; |Format = "%x%x"
00401021 |.68 10304000 PUSH 1.00403010 ; |s = 1.00403010
00401026 |.E8 27000000 CALL <JMP.&user32.wsprintfA> ; \wsprintfA
调用这个函数的时候多了push 0,我们解析一下,第一个变量是年份,输出的时候取值应该是四个字节。push 0是压入四个字节的,所以取低地址两个自己年份和push的两个字节组成的是0000+年份输出的结果是正确的年(因为高位写0结果不变例如0x01和0x1是一样的)。但是月份就有问题了。高位时月份低位时push的另外两个0,所以是 月份+0000,结果肯定不对啊(0x1和0x10000肯定不一样),所以才出现月份这么大的原因,以后调用参数可变的函数时(例如wsprintf),压入的参数最好是四个字节的 要么把数据转换成四个字节当作参数,要么老老实实自己push call 小名明SIU 发表于 2014-6-22 21:37 static/image/common/back.gif
要么把数据转换成四个字节当作参数,要么老老实实自己push call
额,谢谢我去弄弄个
页:
[1]