欢迎来到尧图网

客户服务 关于我们

您的位置:首页 > 汽车 > 时评 > win32汇编环境,得到当前日期时间的例子

win32汇编环境,得到当前日期时间的例子

2025/2/22 2:03:47 来源:https://blog.csdn.net/iltokyo/article/details/145654640  浏览:    关键词:win32汇编环境,得到当前日期时间的例子

;运行效果

;win32汇编环境,得到当前日期时间的例子
;有2个函数可以使用,GetLocalTime和GetSystemTime,一般用GetLocalTime,得到本地时间,GetSystemTime的是系统时间,也叫世界时,专业方向的人用,我们一般也用不上。
;下列示例得到本地时间,同时加定时器,每秒更新,看起来像有个时钟在运行的样子
;直接抄进RadAsm可编译运行。重要部分加备注。
;下面为asm文件
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
.386 
.model flat,stdcall 
option casemap:none 
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
; Include 文件定义
include    windows.inc 
include    user32.inc 
include    kernel32.inc 
includelib user32.lib 
includelib kernel32.lib 
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
; 自定义函数声明
DlgProc proto :DWORD,:DWORD,:DWORD,:DWORD   ;对话框窗口函数
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
; 数据段
.data 
DlgName    db "MyDialog",0 

szMsg      db "提示",0 
szFormat01 db "当前日期是:%d年%d月%d日 ",0


szWeek00   db " 星期日",0
szWeek01   db " 星期一",0
szWeek02   db " 星期二",0
szWeek03   db " 星期三",0
szWeek04   db " 星期四",0
szWeek05   db " 星期五",0
szWeek06   db " 星期六",0

szFormat02 db "当前时间是: %d:%d:%d",0
.data? 
hInstance HINSTANCE             ? 
.const 
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
;Equ 等值定义

ICO_MAIN    equ 1000    ;图标  
IDC_VALUE01 equ 201 
IDC_VALUE02 equ 202 

ID_TIMER1   equ    1
; 代码段
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
.code 
start:     
        invoke GetModuleHandle, NULL     
        mov    hInstance,eax     
        invoke DialogBoxParam, hInstance, ADDR DlgName,NULL, addr DlgProc, NULL     
        invoke ExitProcess,eax 
DlgProc proc hWnd:HWND, uMsg:UINT, wParam:WPARAM, lParam:LPARAM 
        LOCAL    @stTime:SYSTEMTIME                                ;定义1个名为@stTime的SYSTEMTIME 结构,里面包含了年、月、星期、天、小时、分钟、秒、毫秒这些成员,得到这些值后,直接使用就可以了
        LOCAL   @hYear,@hMonth,@hDay,@hWeek                       ;SYSTEMTIME结构中的wYear、wMonth这些成员是WORD 类型,就是2字节类型,所以定义时也用了WORD型
        LOCAL   @hHour,@hMinute,@hSecond
        LOCAL   @szBuffer[256]:byte
       
        .if      uMsg == WM_INITDIALOG                 
                        invoke LoadIcon,hInstance,ICO_MAIN           
                        invoke SendMessage,hWnd,WM_SETICON,ICON_BIG,eax 
                        
                        invoke    GetLocalTime,addr @stTime 
                        invoke  RtlZeroMemory,addr @szBuffer,sizeof @szBuffer
                        xor eax,eax                              ;把eax清零,因为后面要取低2字节,需防止高2字节里有数据
                        mov ax,@stTime.wYear                     ;wYear、wMonth这些成员是WORD 类型,就是2字节类型,所以前面用ax对应2字节 
                        mov @hYear,eax                           ;但是@hYear定义时默认的是DWORD型,即4字节,而上面的ax是2字节,不匹配,所以需用eax
                        xor eax,eax                              
                        mov ax,@stTime.wMonth
                        mov @hMonth,eax
                        xor eax,eax
                        mov ax,@stTime.wDay
                        mov @hDay,eax
                        invoke  wsprintf,addr @szBuffer,addr szFormat01,@hYear,@hMonth,@hDay       ;格式化年、月、日字符串到@szBuffer字符数组里去
                        mov bx,@stTime.wDayOfWeek                                                  ;wDayOfWeek是星期,但是数值,比如星期日是0,星期一是1,以此类推
                        .if bx == 0                                                                ;如果是星期日,则把前面定义的星期日的字符串添加上去
                            invoke lstrcat,addr @szBuffer,addr szWeek00
                        .elseif bx == 1    
                                invoke lstrcat,addr @szBuffer,addr szWeek01
                        .elseif bx == 2    
                                invoke lstrcat,addr @szBuffer,addr szWeek02
                        .elseif bx == 3    
                                invoke lstrcat,addr @szBuffer,addr szWeek03
                        .elseif bx == 4    
                                invoke lstrcat,addr @szBuffer,addr szWeek04
                        .elseif bx == 5    
                                invoke lstrcat,addr @szBuffer,addr szWeek05
                        .elseif bx == 6    
                                invoke lstrcat,addr @szBuffer,addr szWeek06                                               
                        .endif

                        invoke    SetDlgItemText,hWnd,IDC_VALUE01,addr @szBuffer  
                        
                        invoke  RtlZeroMemory,addr @szBuffer,sizeof @szBuffer                        
                        mov ebx,ebx
                        mov bx,@stTime.wHour                     
                        mov @hHour,ebx 
                        mov ebx,ebx          
                        mov bx,@stTime.wMinute
                        mov @hMinute,ebx
                        mov ebx,ebx
                        mov bx,@stTime.wSecond
                        mov @hSecond,ebx
                        invoke  wsprintf,addr @szBuffer,addr szFormat02,@hHour,@hMinute,@hSecond     ;格式化时、分、秒字符串到@szBuffer字符数组里去
                        invoke    SetDlgItemText,hWnd,IDC_VALUE02,addr @szBuffer
                        
                        invoke    SetTimer,hWnd,ID_TIMER1,1000,NULL                                    ;设定每隔1秒触发的定时器
        .elseif    uMsg ==    WM_TIMER                                                                     ;处理定时器消息
        mov    eax,wParam
        .if    eax ==    ID_TIMER1
                invoke  RtlZeroMemory,addr @szBuffer,sizeof @szBuffer
                invoke    GetLocalTime,addr @stTime
                mov ebx,ebx
                        mov bx,@stTime.wHour                     
                        mov @hHour,ebx 
                        mov ebx,ebx          
                        mov bx,@stTime.wMinute
                        mov @hMinute,ebx
                        mov ebx,ebx
                        mov bx,@stTime.wSecond
                        mov @hSecond,ebx
                        invoke  wsprintf,addr @szBuffer,addr szFormat02,@hHour,@hMinute,@hSecond     ;格式化时、分、秒字符串到@szBuffer字符数组里去
                        invoke    SetDlgItemText,hWnd,IDC_VALUE02,addr @szBuffer
                        invoke  GetDC,hWnd
        .endif                             
        .elseif uMsg == WM_CLOSE 
                        invoke    KillTimer,hWnd,ID_TIMER1                                            ;离开时记得清除定时器                
                        invoke EndDialog, hWnd,NULL         
        .else                
                mov eax,FALSE                 
                ret                 
        .endif                 
        mov eax,TRUE         
        ret 
DlgProc endp 

end start 

;下面为rc文件内容
#include "resource.h"              //提示缺少该文件,可以在资源里下载

//>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
#define    ICO_MAIN        1000    //图标  
#define    IDC_VALUE01       201
#define    IDC_VALUE02       202 
//>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
ICO_MAIN    ICON        "Main.ico"

//>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>

//定义对话框
MyDialog DIALOG 10, 10, 205, 150 
STYLE  DS_CENTER | WS_CAPTION | WS_MINIMIZEBOX | WS_SYSMENU | WS_VISIBLE | WS_OVERLAPPED | DS_MODALFRAME | DS_3DLOOK 
CAPTION "对话框程序模版"
FONT 12, "宋体"
BEGIN
       LTEXT "0", IDC_VALUE01, 25, 50, 150, 8
       LTEXT "0", IDC_VALUE02, 25, 80, 150, 8
END 

//>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com

热搜词