现在的位置: 首页 > 综合 > 正文

汇编语言GetDateTime代码分析(20)

2013年03月20日 ⁄ 综合 ⁄ 共 1606字 ⁄ 字号 评论关闭

本文代码来自于《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

 

 

 

代码结束。

抱歉!评论已关闭.