首页
社区
课程
招聘
[求助]masm中设置窗口类实例句柄问题?
发表于: 2007-6-20 16:08 7267

[求助]masm中设置窗口类实例句柄问题?

2007-6-20 16:08
7267
.data?
hInstance dd ?

....
.code
local @stWndClass:WNDCLASSEX
....
invoke GetModuleHandle,NULL
mov hInstance,eax
push hInstance
pop @stWndClass.hInstance

....

请问在给窗口类设置实例句柄的时候为什么使用push hInstance pop @stWndClass.hInstance 而不直接使用mov @stWndClass.hInstance,hInstance呢?

[培训]科锐逆向工程师培训第53期2025年7月8日开班!

收藏
免费 0
支持
分享
最新回复 (13)
雪    币: 796
活跃值: (370)
能力值: ( LV9,RANK:380 )
在线值:
发帖
回帖
粉丝
2
反汇编后可以知道,其实
hInstance
@stWndClass.hInstance
都是指针,对指针的赋值,一般都用 push/pop(直接通过堆栈传递)

当然,你也可以这样写(这个是通过寄存器传递值):

lea   eax,hInstance  ;取出hInstance地址的内容存eax
mov        @stWndClass.hInstance,eax ;保存到@stWndClass.hInstance

说白了,一个直接通过堆栈传递,另一个通过寄存器传递值
上传的附件:
2007-6-20 16:30
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
如果是指针的话  那么我mov @stWndClass.hInstance,offset hInstance也是可以的吧
2007-6-20 16:34
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
invoke GetModuleHandle,NULL
mov hInstance,eax

难道说GetModuleHandle得到的不是句柄,而是句柄的指针吗?
2007-6-20 16:36
0
雪    币: 209
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
如果要用mov的话:

lea eax,hInstance
mov @stWndClass.hInstance,eax

你愿意用哪种?
2007-6-20 16:37
0
雪    币: 2384
活跃值: (766)
能力值: (RANK:410 )
在线值:
发帖
回帖
粉丝
6
楼上两位都写错了。应该是这样用才对。
mov eax,hInstance
mov @stWndClass.hInstance,eax
2007-6-20 16:38
0
雪    币: 2384
活跃值: (766)
能力值: (RANK:410 )
在线值:
发帖
回帖
粉丝
7
迟发了一步,十指紧扣兄已经回复了。
2007-6-20 16:41
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
8
能说说
mov eax,hInstance
mov @stWndClass.hInstance,eax

mov @stWndClass.hInstance,hInstance有什么区别?

mov @stWndClass.hInstance,hInstance ; mov指令不允许两个操作数都是内存,所以这一句是非法的指令,编译器是通不过编译的。所以只能先将内存的值取出来再放进另一个内存里,也就是下面的操作:
push hInstance
pop @stWndClass.hInstance

mov eax,hInstance
mov @stWndClass.hInstance,eax
才行。
上面两种方法都可以,至于用第一种还是第二种就看各人的爱好了。
2007-6-20 16:46
0
雪    币: 796
活跃值: (370)
能力值: ( LV9,RANK:380 )
在线值:
发帖
回帖
粉丝
9
mov @stWndClass.hInstance,hInstance

这句用masmplus编译不过.......
2007-6-20 16:50
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
10
楼上的各位有说是lea eax,hInstance,有的说是mov eax,hInstance,请问哪个是正确的?
请顺便说说lea的功能? 我是新手
2007-6-20 17:01
0
雪    币: 2384
活跃值: (766)
能力值: (RANK:410 )
在线值:
发帖
回帖
粉丝
11
mov eax,hInstance ; 这一句是将hInstance保存的程序实例句柄传给eax
lea eax,hInstance ; 这一句是将hInstance变量的偏移地址传给eax。
而你的程序是要实例句柄而不是要hInstance变量的地址。所以上面的操作这样才对。
mov eax,hInstance
mov @stWndClass.hInstance,eax
而不是:
lea eax,hInstance
mov @stWndClass.hInstance,eax
2007-6-20 18:45
0
雪    币: 2384
活跃值: (766)
能力值: (RANK:410 )
在线值:
发帖
回帖
粉丝
12
晕,我引用lanshen你贴子却变成了编辑你的贴子了。
2007-6-20 18:50
0
雪    币: 380
活跃值: (106)
能力值: ( LV13,RANK:370 )
在线值:
发帖
回帖
粉丝
13
mov @stWndClass.hInstance,hInstance是错误的!
mov指令中除源操作数是立即数外,必须有一操作数为寄存器操作数!
2007-6-20 19:21
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
14
3Q 谢谢各位
2007-6-21 09:01
0
游客
登录 | 注册 方可回帖
返回