首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 嵌入开发 > 汇编语言 >

windows计时器,完全弄晕了

2014-03-14 
windows计时器,完全搞晕了.386.mo

windows计时器,完全搞晕了

>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
.386
.model flat,stdcall
option casemap:none
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
; Include 文件定义
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
includewindows.inc
includeuser32.inc
includelibuser32.lib
includekernel32.inc
includelibkernel32.lib
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
ID_TIMER1equ1
ID_TIMER2equ2
ICO_1equ1
ICO_2equ2
DLG_MAINequ1
IDC_SETICONequ100
IDC_COUNTequ101
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
; 数据段
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
.data?
hInstancedd?
hWinMaindd?
dwCountdd?
idTimerdd?
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
; 代码段
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
.code
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
; 定时器过程
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
_ProcTimerproc_hWnd,_uMsg,_idEvent,_dwTime

pushad
invokeGetDlgItemInt,hWinMain,IDC_COUNT,NULL,FALSE
inceax
invokeSetDlgItemInt,hWinMain,IDC_COUNT,eax,FALSE
popad
ret

_ProcTimerendp
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
; 窗口过程
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
_ProcDlgMainprocuses ebx edi esi,hWnd,uMsg,wParam,lParam

moveax,uMsg
;********************************************************************
.ifeax ==WM_TIMER
moveax,wParam
.ifeax ==ID_TIMER1
incdwCount
moveax,dwCount
andeax,1
inceax
invokeLoadIcon,hInstance,eax
invokeSendDlgItemMessage,hWnd,IDC_SETICON,STM_SETIMAGE,IMAGE_ICON,eax
.elseifeax ==ID_TIMER2
invokeMessageBeep,-1
.endif
;********************************************************************
.elseifeax ==WM_INITDIALOG
pushhWnd
pophWinMain
invokeSetTimer,hWnd,ID_TIMER1,250,NULL
invokeSetTimer,hWnd,ID_TIMER2,2000,NULL
invokeSetTimer,NULL,NULL,1000,addr _ProcTimer
movidTimer,eax
;********************************************************************
.elseifeax ==WM_CLOSE
invokeKillTimer,hWnd,ID_TIMER1
invokeKillTimer,hWnd,ID_TIMER2
invokeKillTimer,NULL,idTimer
invokeEndDialog,hWnd,NULL
;********************************************************************
.else
moveax,FALSE
ret
.endif
moveax,TRUE
ret

_ProcDlgMainendp
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
start:
invokeGetModuleHandle,NULL
movhInstance,eax
invokeDialogBoxParam,hInstance,DLG_MAIN,NULL,offset _ProcDlgMain,NULL
invokeExitProcess,NULL
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>


endstart


来自罗云彬-第6章,完全看晕了!期盼大家给我指导:
1.
.ifeax ==WM_TIMER
moveax,wParam
.ifeax ==ID_TIMER1
incdwCount
moveax,dwCount
andeax,1
inceax
invokeLoadIcon,hInstance,eax
invoke  SendDlgItemMessage,hWnd,IDC_SETICON,STM_SETIMAGE,IMAGE_ICON,eax
.elseifeax ==ID_TIMER2
invokeMessageBeep,-1
.endif

这一段看得也是莫名其妙,首先,这个dwcount是个变量,没有初值,inc dwcount之后这玩意到底是什么值呢?再赋给eax,再用一句“and eax,1”就是让eax==1吧,再inc eax,也就是eax==2咯,结合后面的代码就是实现2个ICON不停的换来换去吧,那直接push eax ,mov eax,2,pop eax不就行了?
2.定时器过程
_ProcTimerproc_hWnd,_uMsg,_idEvent,_dwTime

pushad
invokeGetDlgItemInt,hWinMain,IDC_COUNT,NULL,FALSE
inceax
invokeSetDlgItemInt,hWinMain,IDC_COUNT,eax,FALSE
popad
ret

_ProcTimerendp
这一段代码里,eax的值到底是多少?它是怎么来的呢?计时器怎么就会通过它实现了从1开始计数呢?
完全不理解eax的取值来自于哪里

3.补充一个问题,书上是这么说的,用settimer函数向windows申请一个定时器,如果成功,系统会以指定的时间周期调用settimer函数指定的回调函数,或者向指定的窗口过程发送wm_timer信息,那么在这个例子里面,回调函数是没有的吧,是不是指定的窗口过程就是指timer1和timer2使用的ProcDlgMain,以及第3个计时器用的ProcTimer??
[解决办法]
引用:
这一段代码里,eax的值到底是多少?它是怎么来的呢?计时器怎么就会通过它实现了从1开始计数呢?
完全不理解eax的取值来自于哪里


eax显然是invoke    GetDlgItemInt,hWinMain,IDC_COUNT,NULL,FALSE的返回值
是窗口控件IDC_COUNT输入的数字值

热点排行