首页
社区
课程
招聘
[求助]RET指令的一点疑惑
发表于: 2007-11-11 21:52 7081

[求助]RET指令的一点疑惑

2007-11-11 21:52
7081
我刚看老罗的书有一点不大明白,就是下面这段代码中为什么要在  DefWindowProc,hWnd,uMsg,wParam,lParam
   ret
这个函数调用后加一个RET指令,而前面的函数调用都没有加?我认为既然前面都没有ret指令也能返回0那么这个函数没有RET应该也能返回吧,结果我把这个RET指令去掉后窗口就不显示了。我比较菜,希望大侠们不要笑,给我解释下~~谢谢大家了。

.if eax == WM_PAINT
   invoke BeginPaint,hWnd,addr @stPs
   mov @hDc,eax

   invoke GetClientRect,hWnd,addr @stRect
   invoke DrawText,@hDc,addr szText,-1,
    addr @stRect,
    DT_SINGLELINE or DT_CENTER or DT_VCENTER

   invoke EndPaint,hWnd,addr @stPs
;********************************************************************
  .elseif eax == WM_CLOSE
   invoke DestroyWindow,hWinMain
   invoke PostQuitMessage,NULL
;********************************************************************
  .else
   invoke DefWindowProc,hWnd,uMsg,wParam,lParam
   ret
  .endif
;********************************************************************
  xor eax,eax
  ret

[课程]Linux pwn 探索篇!

收藏
免费 0
支持
分享
最新回复 (6)
雪    币: 1746
活跃值: (287)
能力值: (RANK:450 )
在线值:
发帖
回帖
粉丝
2
有ret时返回的是调用DefWindowProc的结果

你把它去掉了,就xor eax,eax  永远返回0了
2007-11-11 22:32
0
雪    币: 103
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
你的意思是不是说上面的所有函数都可以用  XOR EAX,EAX来返回一个0,但DefWindowProc,hWnd,uMsg,wParam,lParam
函数要用RET指令来返回其他的值?如果不是的话那前面的函数是怎么来返回0的?
2007-11-11 23:08
0
雪    币: 2899
活跃值: (1753)
能力值: ( LV9,RANK:850 )
在线值:
发帖
回帖
粉丝
4
对于汇编指令:
ret
就是把EAX寄存器中的值返回

XOR EAX,EAX  就是对EAX寄存器清零
所以接下来的RET 就把零返回去了

调用DefWindowProc,hWnd,uMsg,wParam,lParam后,
在EAX中就是一个LRESULT型数据(整型数据)
接下来,就把它返回了。

消息队列中有许多消息

有些消息,就像前面的if ,else ...
只是我们重载,也就是修改Windows系统默认的处理方式

其它消息不可能不处理吧

于是调用默认的Windows消息处理函数DefWindowProc进行处理。
所有的默认消息,你都给它返回个0,操作系统怎么知道你要处理什么东东呢?
要求显示窗口的消息就丢掉了,系统没有处理,当然不能显示窗口了!!!

说得我自已都糊涂了。
2007-11-12 06:36
0
雪    币: 103
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
谢谢linxer和wofan[OCN]。终于搞明白了~~~
2007-11-12 11:07
0
雪    币: 3758
活跃值: (3282)
能力值: ( LV15,RANK:500 )
在线值:
发帖
回帖
粉丝
6
retn是返回调用处, 改变流程用的.
retn后如果有数字, 则是用来调整调用方移动的栈指针, 不是用来返回返回值的.
根据调用约定的不同, 只要返回值所存储的寄存器/内存单元发生变化, 则当时的返回值已经变化了.
不加ret的代码会继续往下走. 这段代码的结构已经破坏了鸟, 啾啾啾
2007-11-16 13:54
0
雪    币: 350
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
7
我也明白了. 默认的DefWindowProc需要RET返回EAX值进行处理,微软这样规定的
清零后再返回,相当于那个默认的没运行
2007-11-18 02:22
0
游客
登录 | 注册 方可回帖
返回
//