| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 2293 人关注过本帖, 1 人收藏
标题:有人知道WIN32 API参数传递的详细过程和步骤吗?
取消只看楼主 加入收藏
W32Asm
Rank: 1
等 级:新手上路
帖 子:8
专家分:0
注 册:2010-12-10
结帖率:100%
收藏(1)
已结贴  问题点数:20 回复次数:5 
有人知道WIN32 API参数传递的详细过程和步骤吗?
各位高手,有人知道WIN32 API参数传递的详细过程和步骤吗?
我遇到个问题,一直想不明白,请教!
看下面例子(不完整,只有关键部分)
.data
stGlt    SYSTEMTIME    <?>
szTimeout    db    128 dup (?)
szFormat    db    '%x:%x',0

.......

invoke    GetLocalTime,addr stGlt
invoke    wsprintf,addr szTimeOut,addr szFormat,stGlt.wHour,stGlt.wMinute
invoke    MessageBox,NULL,addr szTimeOut,NULL,MB_OK

这个程序是想显示时间,输出的格式用了十六进制输出。
假如现在时间是17:01,则显示结果为:11:10000(这就是让我纳闷的地方),为什么会多出0000这个数值。

我把程序进行了编译成exe后,进行反编译,显示这样:
0040100C  |.  68 04304000   push    00403004                         ; /pSecurity = test.00403004
00401011  |?  E8 42000000   call    <jmp.&kernel32.GetLocalTime>
00401016  |?  6A 00         push    0
00401018  |.  66:FF35 0E304>push    word ptr [40300E]                ; /FailIfExists = FALSE
0040101F  |.  6A 00         push    0                                ; |ExistingFileName = NULL
00401021  |?  66:FF35 0C304>push    word ptr [40300C]
00401028  |?  68 46204000   push    00402046                         ;  ASCII "%x:%x"
0040102D   ?  68 2C304000   push    0040302C
00401032   ?  E8 2D000000   call    <jmp.&user32.wsprintfA>
00401037   ?  83C4 10       add     esp, 10
0040103A   ?  6A 00         push    0
0040103C   .  6A 00         push    0
0040103E   ?  68 2C304000   push    0040302C
00401043   ?  6A 00         push    0
00401045   ?  E8 20000000   call    <jmp.&user32.MessageBoxA>

从反编译看,在push stGlt.wHour和push stGlt.wMinute时,因为stGlt.wHour和stGlt.wMinute是word类型,所以push的时候,又自动加了push 0,但是不知道为什么在pop的时候怎么操作的,给pop stGlt.wHour值是对的,但是pop stGlt.wMinute却多出了0000。

麻烦高手解答,谢谢。顺便,谁能说一下API关于参数使用时,push和pop的详细过程更好。
搜索更多相关主题的帖子: 十六进制 现在时间 
2012-09-06 17:30
W32Asm
Rank: 1
等 级:新手上路
帖 子:8
专家分:0
注 册:2010-12-10
收藏
得分:0 
回复 2楼 zklhp
这些,我大概也都明白,但是他们都是针对dword类型,我的问题中,是涉及到word类型,结果就出错了,我想知道错误的具体原因。难道WIN32ASM中就没办法了,只能用dword类型参数吗?

或者像你说的用movzx,这个用法我也知道,用了movzx是可以完美解决问题,但我还是想知道为什么我的问题中的做法错在哪儿了,不会就一句简单的WIN32ASM只能用dword类型参数?
2012-09-06 18:28
W32Asm
Rank: 1
等 级:新手上路
帖 子:8
专家分:0
注 册:2010-12-10
收藏
得分:0 
回复 5楼 zklhp
貌似是,但是我压入word类型参数,从反编译来看,它自动补齐了。

但是,它最让我莫名其妙的是,显示的小时wHour,是正确的,显示的分钟wMinute错误。我故意把两个参数颠倒顺序,结果是分钟wMinute显示对了,小时wHour却多了0000.我猜测是跟出栈时有关系,后入栈的能够正确出栈,最先入栈的wMinute出栈的时候错误了。
2012-09-06 18:58
W32Asm
Rank: 1
等 级:新手上路
帖 子:8
专家分:0
注 册:2010-12-10
收藏
得分:0 
回复 8楼 水哥
时间结构里面是定义的类型是字,字引用的话是变成word ptr [xxx+偏移],在我的反汇编中也是这样的:
00401018  |.  66:FF35 0E304>push    word ptr [40300E]                ; /FailIfExists = FALSE
0040101F  |.  6A 00         push    0                                ; |ExistingFileName = NULL
00401021  |?  66:FF35 0C304>push    word ptr [40300C]
00401028  |?  68 46204000   push    00402046                         ;  ASCII "%x:%x"
0040102D   ?  68 2C304000   push    0040302C
00401032   ?  E8 2D000000   call    <jmp.&user32.wsprintfA>

WIN32 ASM出、入栈都是32位的,所以我在写源程序的时候,直接应用了stGlt.wHour(是字类型),经过反编译后,看到自动给补0了。但是不明白出栈就出现错误了。
2012-09-12 19:42
W32Asm
Rank: 1
等 级:新手上路
帖 子:8
专家分:0
注 册:2010-12-10
收藏
得分:0 
回复 10楼 zklhp
我不是不想结贴,只是我还没明白为什么会出现这个现象的详细原因?

难道我没有弄清楚问题,就要早早的结贴吗?
2012-09-12 19:44
W32Asm
Rank: 1
等 级:新手上路
帖 子:8
专家分:0
注 册:2010-12-10
收藏
得分:0 
哈哈,我明白了,谢谢各位!原来是自动补0惹的祸!
2012-09-13 00:49
快速回复:有人知道WIN32 API参数传递的详细过程和步骤吗?
数据加载中...
 
   



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

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