WIN32汇编语言教程:第06章 定时器 · 6.3 取Windows时间
很多读者看到“定时器”这个词的时候往往就联想到时钟,笔者也曾是如此,但是经过6.2节的介绍后就可以发现,定时器是不能用来构造时钟的,定时器用于时钟程序中只能是用在定时刷新屏幕这个功能上,要得到系统的时间还是要靠别的方法。
在Win32编程中,和获取系统时间相关的函数有3个:
invoke GetLocalTime,lpSystemTime invoke GetSystemTime,lpSystemTime invoke GetTickCount
它们之间的区别是:
GetTickcount返回的是本次Windows启动以来的ms数,得到的时间数值直接在eax中返回,由于这是一个32位的整数,可以表示的范围是1~ffffffffh ms,所以当Windows连续运行49.7天以后,计数器会清零并重新开始。
GetLocalTime返回当前的时间,GetSystemTime返回当前的格林威治标准时间,这两个函数返回的时间数据包括年、月、日、时、分、秒、毫秒以及星期,数据比较多,所以无法放在eax中返回,应用程序需要预先设置一个SYSTEMTIME结构的缓冲区,并将缓冲区地址lpSystemTime当参数传递给函数,函数会把时间数据返回到这个缓冲区中。
SYSTEMTIME结构的定义如下:
SYSTEMTIME STRUCT wYear WORD ? ;年 wMonth WORD ? ;月 wDayOfWeek WORD ? ;星期,0=星期日,1=星期一,...... wDay WORD ? ;日 wHour WORD ? ;时 wMinute WORD ? ;分 wSecond WORD ? ;秒 wMilliseconds WORD ? ;毫秒 SYSTEMTIME ENDS
需要注意的是,结构中的字段全部是word类型的,而Win32程序中用的往往是dword型变量,所以在使用这些数据之前往往要先把它们转换为dword类型,用movzx指令就可以很方便地完成这个工作,如movzx eax,stSystemTime.wYear将wYear字段扩展到32位后放到eax中。
和获取系统时间的函数相对应,可以用下面的两个函数设置系统时间:
invoke SetLocalTime,lpSystemTime invoke SetSystemTime,lpSystemTime
同样,SetLocalTime中的参数代表本地时间,SetSysTime中的参数代表格林威治标准时间,在调用函数之前,要把需要设置的时间放到一个SYSTEMTIME结构中并把结构地址当做参数传递给Windows。
第06章 定时器
版权所有 © 云南伯恩科技 证书:粤ICP备09170368号