魔诀 发表于 2014-7-2 17:36:30

为什么DefWindowProc后面会跟个ret?

invoke    DefWindowProc,hWhd,uMsg,wParam,lParam
                ret
为什么这个函数后面会有个ret,而调用别的API函数时并不需要,难道DefWindowProc的里面在结尾处没有ret吗?
在对话框这一章节里也有一个问题,就是_ProcDlgMain函数的结尾处总是这样的:
.if
.......
.else
         moveax,FAlSE
         ret
.endif
          mov eax,TRUE
          ret
_ProcDlgMain    endp
第一个ret是怎么回事?

青玄 发表于 2014-7-2 20:11:43

这里的第一个ret是返回到mov eax, uMsg的下一条语句,也就是xor eax, eax处进行执行, 而最后一个ret的话是返回到这个回调函数的上面去,这样将执行回调函数下面的语句,也就是mov @stWndClass.hbrBackground, COLOR_MENU + 1

魔诀 发表于 2014-7-3 05:11:29

青玄 发表于 2014-7-2 20:11 static/image/common/back.gif
这里的第一个ret是返回到mov eax, uMsg的下一条语句,也就是xor eax, eax处进行执行, 而最后一个ret的话是 ...

最后一个ret好理解。第一个ret是如何跳到xor eax,eax处的?在哪儿对xor,eax,eax这条语句的地址进行的入栈?把第一个ret去掉,也能通过编译,只是运行程序时,并没有显示,也就是说并没有运行到ShowWindow

青玄 发表于 2014-7-5 13:52:27

魔诀 发表于 2014-7-3 05:11
最后一个ret好理解。第一个ret是如何跳到xor eax,eax处的?在哪儿对xor,eax,eax这条语句的地址进行的入栈 ...

第一个ret的话,它前面有一个endif语句呢,当执行到第一个ret的时候,它就跳到if之前去执行了!

strumV 发表于 2016-2-26 13:41:15

ProcWinMain 是回调函数,作用是将eax(表示消息处理状态)返回给调用者user32.dll,第一个调用defwindowproc 程序对其返回值不做干涉直接返回eax的值,第二个设置默认的返回值,大多数消息将eax清零表示返回成功,程序设置的默认返回语句。
页: [1]
查看完整版本: 为什么DefWindowProc后面会跟个ret?