windows下编程wsprintf的问题,大伙儿给看一下。

sbw 2003-09-29 09:34:34
; 问题是这样的,我用wsprintf格式化一个字符串,用messagebox显示格式化后的字符串,我理想中的结果应该是“01,01,00”,但是messagebox显示的是“01,10000,00”,害的我编写了一个子程序才搞定,不知原因是什么,请高手赐教。
; 我把程序精简了一下,以便各位观看。

.386
.model flat, stdcall
option casemap :none

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

.data
szMessage db '%02X,%02X,%02X',0
szBuffer db 20 dup(0)
dbBZ db 01h
db 01h
db 00h

.code
Start:
invoke wsprintf,addr szBuffer,addr szMessage,dbBZ[0],dbBZ[1],dbBZ[2]
invoke MessageBox,NULL,addr szBuffer,NULL,MB_OK
invoke ExitProcess,NULL
end Start
...全文
51 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
sbw 2003-10-10
  • 打赏
  • 举报
回复

谢谢各位,非常感谢 dunkel(内心和夜 哪个黑),程序里确实错在你指出的地方。

使用了DWORD后程序执行正常了,稍微有点缺憾,那就是在显示从文件里读取的数据时再转换一下。给分了。
dunkel 2003-10-10
  • 打赏
  • 举报
回复
dbBZ[0],dbBZ[1],dbBZ[2] -> dbBZ[0],dbBZ[4],dbBZ[8]
sbw 2003-10-10
  • 打赏
  • 举报
回复
把数据定义成DWORD了:
dbBZ dword 01h
dword 01h
dword 00h
但更离谱了,显示的是:01,1000000,10000

晕倒~~~~
Areslee 2003-10-09
  • 打赏
  • 举报
回复
API只支持双字宽度的参数
sbw 2003-10-01
  • 打赏
  • 举报
回复
谢谢各位的指点,情况是这样的,要显示的数据是从文件里读取的,然后使用WSPRINTF来格式化进行以十六进制输出,所以如果再把BYTE转换成DWORD的话也挺麻烦的,请大家再想想用WSPRINTF怎样显示BYTE类型的数。谢谢了。(过完国庆再来)
紫郢剑侠 2003-10-01
  • 打赏
  • 举报
回复
读入后用 MOVZX来扩展.
Areslee 2003-09-30
  • 打赏
  • 举报
回复
数据定义成DWORD试试
dunkel 2003-09-30
  • 打赏
  • 举报
回复
但是现在的情况是, wsprintf 并不是将 byte 补充到 dword, 而是对一个参数总共压栈了 6 个 bytes !
Tiangua 2003-09-30
  • 打赏
  • 举报
回复
xue xi
紫郢剑侠 2003-09-30
  • 打赏
  • 举报
回复
wsprintf的操作数总是用DWORD, 以前我就领教过了.不是DWORD就会自动压入0来补, 从而出出现dunkel(内心和夜 哪个黑)说的情况.

所以如Areslee(易水)所说定义数据成DWORD
dunkel 2003-09-29
  • 打赏
  • 举报
回复
00401000: 6A00 push 000
00401002: A025304000 mov al,[000403025]
00401007: 660FB6C0 movzx ax,al
0040100B: 6650 push ax
0040100D: 6A00 push 000
0040100F: A024304000 mov al,[000403024]
00401014: 660FB6C0 movzx ax,al
00401018: 6650 push ax
0040101A: 6A00 push 000
0040101C: A023304000 mov al,[000403023]
00401021: 660FB6C0 movzx ax,al
00401025: 6650 push ax
00401027: 6800304000 push 000403000
0040102C: 680F304000 push 00040300F
00401031: E81A000000 call .000401050
上面是生成的.exe的内容.

不太明白为什么要先压栈个 00 的 dword , 然后是将字节 al 转换为字 ax (movzx ax, al), 再竟然是将 ax (字) 压栈, 所以栈里的数据就错位了, 因为应该是以 dword (双字) 来对齐的. 正常的做法要么是先压栈个 00 的 字 (word) , 要么不须先压栈这个 00 , 后面直接就是 movzx eax, al push eax .

ml 这么个做法确实比较奇怪!

21,453

社区成员

发帖
与我相关
我的任务
社区描述
汇编语言(Assembly Language)是任何一种用于电子计算机、微处理器、微控制器或其他可编程器件的低级语言,亦称为符号语言。
社区管理员
  • 汇编语言
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧