本文代码来自于《Intel汇编语言程序设计》(第四版)第11章---------32位windows编程。
GetDateTime其实是作者Irvine32库文件中的一个函数,它用来返回一个64位的整数,这个数值是自1601年1月1日开始的以100纳秒为单位的计数值。重要的是微软使用这个数值来作为文件的日期和时间。WIN32 SDK文档中给出的获得系统日期和时间的步骤如下:
1.调用一个函数(例如GetLocalTime)来填写SYSTEMTIME结构。
2.用SystemTimeToFileTime函数来讲SYSTEMTIME结构转换到FILETIME结构。
3.将FILETIME结构中的结果拷贝到一个64位的QWORD中。
其中FILETIME结构将一个64位的QWORD值划分为2个DWORD值:
FILETIME STRUCT
loDateTime DWORD ?
hiDateTime DWORD ?
FILETIME ENDS
下面是GetDateTime函数代码:
;------------------------------------------------------------------------------------
GetDateTime PROC
pStartTime : PTR QWORD ; 程序接收一个指向QWORD的指针
LOCAL sysTime : SYSTEMTIME , fileTime : FILETIME ; 程序定义了两个局部变量,分别是SYSTEMTIME 类型和FILETIME 类型
;
; Gets and saves the current local date/time as a
; 64-bit integer ( in the Win32 FILETIME format).
;------------------------------------------------------------------------------------
; Get the system local time
INVOKE GetLocalTime , ; 按照微软的建议,先得到一个时间,将它填充到SYSTEMTIME 结构中
ADDR sysTime
; Convert the SYSTEMTIME to FILETIME
INVOKE SystemTimeToFileTime, ; 然后又按照微软的建议,将SYSTEMTIME 结构中的内容填充到FILETIME结构中
ADDR sysTime, ; SYSTEMTIME 结构
ADDR flTime ; FILETIME 结构
; Copy the FILETIME to a 64-bit integer
mov esi , pStartTime ; 然后我们再按照微软的建议执行第三步,这里先得到这个64位QWORD的地址
mov eax , flTime.loDateTime ; 将FILETIME 结构中的loDateTime段赋给eax
mov DWORD PTR [esi] , eax ; 讲eax 赋值到64位的pStartTime的低4字节中
mov eax , flTime.hiDateTime ; 将FILETIME 结构中的hiDateTime段赋给eax
mov DWORD PTR [esi+4] , eax ; 讲eax 赋值到64位的pStartTime的高4字节中
ret ; 按照微软的建议,我们得到了日期和时间,返回主函数
GetDateTime ENDP
代码结束。