вывод текущего времени (GetSystemTime)

Тема в разделе "WASM.BEGINNERS", создана пользователем kb_08h, 27 авг 2006.

  1. kb_08h

    kb_08h New Member

    Публикаций:
    0
    Регистрация:
    16 окт 2005
    Сообщения:
    17
    Адрес:
    Kyiv
    добрый день, уважаемые кодеры.

    учу азм, задался целью написать примитивные "часы", дабы постигнуть дзен WinAPI.
    в окне должно выводится текущее время; исходник компилится, но вместо текущего времени, в окне выводится '%02d:%02d:%02d'

    Код (Text):
    1. format PE GUI 4.0
    2. entry start
    3.  
    4. include '%fasminc%\win32a.inc'
    5.  
    6. section '.data' data readable writeable
    7. ;-------------------------------------------------------------------------
    8.  
    9.         whmain  dd      ?
    10.         whinst  dd      ?
    11.         wtitle  db      'simple clock',0
    12.         class_name db   'class',0
    13.        
    14.         wmsg          MSG
    15.         wcls            WNDCLASS
    16.         stime           SYSTEMTIME
    17.         _ps             PAINTSTRUCT
    18.         _hdc            dd      ?
    19.         _rect           RECT
    20.         _time       db      '%02d:%02d:%02d',0
    21.         _buff        db      9
    22.  
    23. section '.code' readable executable
    24. ;-------------------------------------------------------------------------
    25. start:
    26.        
    27.         ;-->    registering the window class --------------------------------
    28.  
    29.         ;GetModuleHandle (GMH,NULL) returns a handle of the file used to create the calling process
    30.         invoke  GetModuleHandle,NULL
    31.        
    32.         mov     [whinst],eax
    33.         mov     [wcls.hInstance],eax
    34.         mov     [wcls.style],CS_HREDRAW or CS_VREDRAW
    35.         mov     [wcls.lpfnWndProc],window_procedure
    36.         mov     [wcls.lpszClassName],class_name
    37.         mov     [wcls.hbrBackground],COLOR_WINDOW+1
    38.         invoke  LoadIcon,NULL,IDI_WINLOGO
    39.        
    40.         mov     [wcls.hIcon],eax
    41.        
    42.         invoke  LoadCursor,NULL,IDC_ARROW
    43.        
    44.         mov     [wcls.hCursor],eax
    45.        
    46.         invoke  RegisterClass,wcls
    47.                        
    48.         ;--> creating the main window --------------------------------
    49.        
    50.         invoke  CreateWindowEx,\
    51.                         0,\
    52.                         class_name,\
    53.                         wtitle,\
    54.                         WS_OVERLAPPEDWINDOW or WS_VISIBLE,\
    55.                         150,\
    56.                         50,\
    57.                         500,\
    58.                         500,\
    59.                         NULL,\
    60.                         NULL,\
    61.                         [whinst],\
    62.                         NULL
    63.  
    64.         mov     [whmain],eax
    65.         invoke  ShowWindow,[whmain],SW_SHOWNORMAL
    66.  
    67.         ;--> getting system time      ------------------------------
    68.         invoke  GetLocalTime,stime
    69.  
    70.         movzx   eax,[stime.wHour]
    71.         movzx   ebx,[stime.wMinute]
    72.         movzx   edi,[stime.wSecond]
    73.  
    74.         invoke wsprintf,_buff,_time,0,eax,ebx,edi
    75.  
    76.         ;--> entering the message loop ------------------------------
    77.        
    78.         window_msg_loop_start:
    79.        
    80.         invoke  GetMessage,wmsg,NULL,0,0
    81.        
    82.         or              eax,eax
    83.         je              window_message_loop_end
    84.        
    85.         invoke  TranslateMessage,wmsg
    86.         invoke  DispatchMessage,wmsg
    87.        
    88.         jmp             window_msg_loop_start
    89.        
    90.         window_message_loop_end:
    91.        
    92.         invoke  ExitProcess,0
    93.        
    94.         ;--> the window procedure  ----------------------------------
    95.        
    96.         proc    window_procedure,hWnd,uMsg,wParam,lParam
    97.        
    98.         push    ebx
    99.         push    esi
    100.         push    edi
    101.  
    102.         cmp     [uMsg],WM_PAINT
    103.         je      _wmPAINT
    104.         cmp     [uMsg],WM_DESTROY
    105.         je      _wmDESTROY
    106.        
    107.         _wmDEFAULT:
    108.        
    109.         invoke  DefWindowProc,[hWnd],[uMsg],[wParam],[lParam]
    110.         jmp     _wmBYE
    111.        
    112.         _wmPAINT:
    113.        
    114.         invoke  BeginPaint,[hWnd],_ps
    115.         mov     [_hdc],eax
    116.         invoke  GetClientRect,[hWnd],_rect
    117.         invoke  DrawText,\
    118.                 [_hdc],\
    119.                 _time,\
    120.                 -1,\
    121.                 _rect,\
    122.                 DT_SINGLELINE or DT_CENTER or DT_VCENTER
    123.  
    124.         invoke  EndPaint,[hWnd],_ps
    125.         jmp     _wmBYE
    126.        
    127.         _wmDESTROY:
    128.        
    129.         invoke  PostQuitMessage,0
    130.        
    131.         _wmBYE:
    132.        
    133.         pop     edi
    134.         pop     esi
    135.         pop     ebx
    136.         ret
    137.        
    138.         endp
    139.        
    140. section '.idata' import data readable writeable
    141.      library   KERNEL32, 'KERNEL32.DLL',\
    142.                USER32,   'USER32.DLL',\
    143.                GDI32,    'GDI32.DLL'
    144.  
    145.      import    KERNEL32,\
    146.                GetModuleHandle,    'GetModuleHandleA',\
    147.                ExitProcess,        'ExitProcess',\
    148.                GetLocalTime,       'GetLocalTime'
    149.  
    150.      import    USER32,\
    151.                RegisterClass,      'RegisterClassA',\
    152.                CreateWindowEx,     'CreateWindowExA',\
    153.                DefWindowProc,      'DefWindowProcA',\
    154.                ShowWindow,         'ShowWindow',\
    155.                LoadCursor,         'LoadCursorA',\
    156.                LoadIcon,           'LoadIconA',\
    157.                BeginPaint,         'BeginPaint',\
    158.                InvalidateRect,     'InvalidateRect',\
    159.                EndPaint,           'EndPaint',\
    160.                GetMessage,         'GetMessageA',\
    161.                GetClientRect,      'GetClientRect',\
    162.                DrawText,           'DrawTextA',\
    163.                TranslateMessage,   'TranslateMessage',\
    164.                DispatchMessage,    'DispatchMessageA',\
    165.                PostQuitMessage,    'PostQuitMessage',\
    166.                wsprintf,           'wsprintfA'
    167.  
    168.      import    GDI32,\
    169.                TextOut,            'TextOutA'
    где ошибка? =\
     
  2. rmn

    rmn Well-Known Member

    Публикаций:
    0
    Регистрация:
    23 ноя 2004
    Сообщения:
    2.347
    Зачем 0 в параметрах?

     
  3. Asterix

    Asterix New Member

    Публикаций:
    0
    Регистрация:
    25 фев 2003
    Сообщения:
    3.576
    Код (Text):
    1. .486
    2. .model flat, stdcall
    3. option casemap:none
    4. include \masm32\include\windows.inc
    5. include \masm32\include\kernel32.inc
    6. include \masm32\include\user32.inc
    7. includelib user32.lib
    8. includelib kernel32.lib
    9.  
    10.  
    11. .DATA
    12.  
    13. szCaption       db  "LocalTime",0
    14. ALIGN DWORD
    15. szFormat  db  "%s %02u %04u at %02u:%02u:%02u",0
    16. ALIGN DWORD
    17. month  db  "Jan",0
    18.        db  "Feb",0
    19.        db  "Mar",0
    20.        db  "Apr",0
    21.        db  "May",0
    22.        db  "Jun",0
    23.        db  "Jul",0
    24.        db  "Aug",0
    25.        db  "Sep",0
    26.        db  "Oct",0
    27.        db  "Nov",0
    28.        db  "Dec",0
    29.  
    30.  
    31. .DATA?
    32. ALIGN DWORD
    33. _st  SYSTEMTIME  <>
    34. ALIGN DWORD
    35. buffer  db  128 dup (?)
    36.  
    37. .CODE
    38.  
    39. ALIGN DWORD
    40. start:
    41.   mov  ebx, OFFSET _st
    42.   invoke GetLocalTime, ebx
    43.   assume ebx:ptr SYSTEMTIME
    44.   xor eax, eax
    45.   mov ax, [ebx].wSecond
    46.   push eax   ; 1
    47.   mov ax, [ebx].wMinute
    48.   push eax   ; 2
    49.   mov ax, [ebx].wHour
    50.   push eax   ; 3
    51.   mov ax, [ebx].wYear
    52.   push eax   ; 4
    53.   mov ax, [ebx].wDay
    54.   push eax   ; 5
    55.   mov ax, [ebx].wMonth
    56.   lea eax, [month-4+eax*4]
    57.   push eax   ; 6
    58.   assume ebx:nothing
    59.   push OFFSET szFormat   ; 7
    60.   mov esi, OFFSET buffer
    61.   push esi   ; 8
    62.   call wsprintf
    63.   add esp, (8 * SIZEOF DWORD)
    64.   invoke MessageBox, NULL, esi, OFFSET szCaption, MB_OK or MB_ICONINFORMATION
    65.   invoke ExitProcess, 0
    66. End start
    почти то же самое (фасм)
    Код (Text):
    1. format PE GUI 4.0
    2. entry start
    3.  
    4. include '%fasminc%\win32a.inc'
    5.  
    6.  
    7. section '.code' code readable writeable executable
    8.  
    9. align 4
    10. start:
    11.   invoke CreateFile, FileName, GENERIC_WRITE,\
    12.                      FILE_SHARE_READ, 0, CREATE_ALWAYS,\
    13.                      FILE_ATTRIBUTE_NORMAL, 0
    14.   cmp eax, INVALID_HANDLE_VALUE
    15.   je @exit
    16.   mov [hFile], eax
    17.   mov  ebx, _st
    18.   invoke GetLocalTime, ebx
    19.   virtual at ebx
    20.              systime  SYSTEMTIME
    21.   end virtual
    22.   xor eax, eax
    23.   mov ax, [systime.wSecond]
    24.   push eax   ; 1
    25.   mov ax, [systime.wMinute]
    26.   push eax   ; 2
    27.   mov ax, [systime.wHour]
    28.   push eax   ; 3
    29.   mov ax, [systime.wYear]
    30.   push eax   ; 4
    31.   mov ax, [systime.wDay]
    32.   push eax   ; 5
    33.   mov ax, [systime.wMonth]
    34.   lea eax, [month-4+eax*4]
    35.   push eax   ; 6
    36.   push szFormat   ; 7
    37.   mov esi, buffer
    38.   push esi   ; 8
    39.   call [wsprintf]
    40.   add esp, (8 * 4)
    41.   invoke WriteFile, [hFile], esi, eax, NumberOfBytesWritten, 0
    42.   invoke CloseHandle, [hFile]
    43. @exit:
    44.   invoke ExitProcess, 0
    45.  
    46.  
    47. section '.data' data readable writeable
    48.  
    49. FileName    db  'CompileTime.inc',0
    50. align 4
    51. szFormat    db  'CompileTime  db  "%s %02u %04u at %02u:%02u:%02u",0',0
    52. align 4
    53. month       db  "Jan",0
    54.             db  "Feb",0
    55.             db  "Mar",0
    56.             db  "Apr",0
    57.             db  "May",0
    58.             db  "Jun",0
    59.             db  "Jul",0
    60.             db  "Aug",0
    61.             db  "Sep",0
    62.             db  "Oct",0
    63.             db  "Nov",0
    64.             db  "Dec",0
    65.  
    66. section '.udata' readable writeable
    67.  
    68. hFile                 dd  ?
    69. NumberOfBytesWritten  dd  ?
    70. align 4
    71. _st      SYSTEMTIME
    72. align 4
    73. buffer   rb   128
    74.  
    75.  
    76. section '.idata' import data readable writeable
    77.  
    78. library kernel32,'KERNEL32.DLL',\
    79.           user32,'USER32.DLL'
    80.  
    81. include '%fasminc%\APIA\KERNEL32.INC'
    82. include '%fasminc%\APIA\USER32.INC'
     
  4. kb_08h

    kb_08h New Member

    Публикаций:
    0
    Регистрация:
    16 окт 2005
    Сообщения:
    17
    Адрес:
    Kyiv
    rmn:
    спасибо, замечания были учтены, программа работает. =)

    Asterix
    thx, за исходники, очень наглядные пособия, законспектировал. )
     
  5. kb_08h

    kb_08h New Member

    Публикаций:
    0
    Регистрация:
    16 окт 2005
    Сообщения:
    17
    Адрес:
    Kyiv
    подскажите, пожалуйста, как заставить часы "тикать"? я пробую в оконной процедуре обновлять клитентскую область, используя GetUpdateRect, но, очевидно, это неправильно... =\
     
  6. pas

    pas New Member

    Публикаций:
    0
    Регистрация:
    18 апр 2003
    Сообщения:
    330
    Адрес:
    Russia
    Пример в приложении. Правда он не совсем оптимальный, и использует макросы, но полагаю у Вас найдутся свои, более эффективные.
     
  7. kb_08h

    kb_08h New Member

    Публикаций:
    0
    Регистрация:
    16 окт 2005
    Сообщения:
    17
    Адрес:
    Kyiv
    извините за назойливость; пришел к следующему коду, время показывает, но программа не реагирует на системные вызовы, нельзя закрыть, свернуть или переместить окно;

    Код (Text):
    1. format PE GUI 4.0
    2. entry start
    3.  
    4. include '%fasminc%\win32a.inc'
    5.  
    6. section '.data' data readable writeable
    7. ;-------------------------------------------------------------------------
    8.  
    9.     whmain  dd  ?
    10.     whinst  dd  ?
    11.     wtitle  db  'clock',0
    12.     class_name db   'class',0
    13.     id_timer   db   'timer'
    14.     wmsg        MSG
    15.     wcls        WNDCLASS
    16.     stime       SYSTEMTIME
    17.     _ps     PAINTSTRUCT
    18.     _hdc        dd  ?
    19.     _rect       RECT
    20.     _time       db      '%02d:%02d:%02d',0
    21.     _buff        rb      9
    22.              db      0
    23.  
    24. section '.code' readable executable
    25. ;-------------------------------------------------------------------------
    26. start:
    27.    
    28.     ;-->    registering the window class --------------------------------
    29.  
    30.     invoke  GetModuleHandle,NULL
    31.     mov [whinst],eax
    32.     mov [wcls.hInstance],eax
    33.     mov [wcls.style],CS_HREDRAW or CS_VREDRAW
    34.     mov [wcls.lpfnWndProc],window_procedure
    35.     mov [wcls.lpszClassName],class_name
    36.     mov [wcls.hbrBackground],COLOR_WINDOW+1
    37.     invoke  LoadIcon,NULL,IDI_WINLOGO
    38.     mov [wcls.hIcon],eax
    39.     invoke  LoadCursor,NULL,IDC_ARROW
    40.     mov [wcls.hCursor],eax
    41.     invoke  RegisterClass,wcls
    42.            
    43.     ;--> creating the main window --------------------------------
    44.    
    45.     invoke  CreateWindowEx,\
    46.             0,\
    47.             class_name,\
    48.             wtitle,\
    49.             WS_OVERLAPPEDWINDOW or WS_VISIBLE,\
    50.             CW_USEDEFAULT,\
    51.             CW_USEDEFAULT,\
    52.             120,\
    53.             50,\
    54.             NULL,\
    55.             NULL,\
    56.             [whinst],\
    57.             NULL
    58.  
    59.     mov [whmain],eax
    60.     invoke  ShowWindow,[whmain],SW_SHOWNORMAL
    61.  
    62.     ;--> entering the message loop ------------------------------
    63.    
    64.     window_msg_loop_start:
    65.    
    66.     invoke  GetMessage,wmsg,NULL,0,0
    67.    
    68.     or      eax,eax
    69.     je      window_message_loop_end
    70.    
    71.     invoke  TranslateMessage,wmsg
    72.     invoke  DispatchMessage,wmsg
    73.    
    74.     jmp     window_msg_loop_start
    75.    
    76.     window_message_loop_end:
    77.    
    78.     invoke  ExitProcess,0
    79.    
    80.     ;--> the window procedure  ----------------------------------
    81.    
    82.     proc    window_procedure,hWnd,uMsg,wParam,lParam
    83.  
    84.     invoke  DefWindowProc,[hWnd],[uMsg],[wParam],[lParam]
    85.  
    86.     push    ebx
    87.     push    esi
    88.     push    edi
    89.  
    90.  
    91.     cmp [uMsg],WM_CREATE
    92.     je  .wm_create
    93.     cmp [uMsg],WM_TIMER
    94.     je  .wm_timer
    95.     cmp [uMsg],WM_DESTROY
    96.     je  .wm_destroy
    97.  
    98.     ;---------------------------------------
    99.     .wm_create:
    100.     invoke SetTimer,[hWnd],id_timer,200,NULL       ;0.2 seconds interval
    101.     jmp    .finish
    102.     ;---------------------------------------
    103.     .wm_timer:
    104.  
    105.     invoke  GetLocalTime,stime
    106.     movzx   eax,[stime.wHour]
    107.     movzx   ebx,[stime.wMinute]
    108.     movzx   edi,[stime.wSecond]
    109.     invoke  wsprintf,_buff,_time,eax,ebx,edi
    110.  
    111.  
    112.     invoke  GetDC,[hWnd]
    113.     mov [_hdc],eax
    114.  
    115.     invoke  GetClientRect,[hWnd],_rect
    116.     invoke  DrawText,\
    117.         [_hdc],\
    118.         _buff,\
    119.         -1,\
    120.         _rect,\
    121.         DT_SINGLELINE or DT_CENTER or DT_VCENTER
    122.     invoke  ReleaseDC,[hWnd],[_hdc]
    123.  
    124.     jmp .finish
    125.     ;---------------------------------------
    126.     .wm_destroy:
    127.  
    128.     invoke  KillTimer,[hWnd],id_timer
    129.     invoke  PostQuitMessage,0
    130.     jmp .finish
    131.     ;---------------------------------------
    132.     .finish:
    133.     pop edi
    134.     pop esi
    135.     pop ebx
    136.     ret
    137.    
    138.     endp
    139.  
    140. ;-------------------------------------------------------------------------
    141. section '.idata' import data readable writeable
    142.      library   KERNEL32, 'KERNEL32.DLL',\
    143.            USER32,   'USER32.DLL',\
    144.            GDI32,    'GDI32.DLL'
    145.  
    146.      import    KERNEL32,\
    147.            GetModuleHandle,    'GetModuleHandleA',\
    148.            ExitProcess,    'ExitProcess',\
    149.            GetLocalTime,       'GetLocalTime'
    150.  
    151.      import    USER32,\
    152.            RegisterClass,      'RegisterClassA',\
    153.            CreateWindowEx,     'CreateWindowExA',\
    154.            DefWindowProc,      'DefWindowProcA',\
    155.            ShowWindow,     'ShowWindow',\
    156.            LoadCursor,     'LoadCursorA',\
    157.            LoadIcon,       'LoadIconA',\
    158.            BeginPaint,     'BeginPaint',\
    159.            InvalidateRect,     'InvalidateRect',\
    160.            EndPaint,       'EndPaint',\
    161.            GetMessage,     'GetMessageA',\
    162.            GetClientRect,      'GetClientRect',\
    163.            GetDC,          'GetDC',\
    164.            ReleaseDC,      'ReleaseDC',\
    165.            DrawText,       'DrawTextA',\
    166.            TranslateMessage,   'TranslateMessage',\
    167.            DispatchMessage,    'DispatchMessageA',\
    168.            PostQuitMessage,    'PostQuitMessage',\
    169.            wsprintf,       'wsprintfA',\
    170.            SetTimer,       'SetTimer',\
    171.            KillTimer,      'KillTimer'
    172.  
    173.      import    GDI32,\
    174.            TextOut,        'TextOutA'
    прошу тыкнуть меня интерфейсом в ошибку, буду весьма признателен; спасибо.
     
  8. Freeman

    Freeman New Member

    Публикаций:
    0
    Регистрация:
    10 фев 2005
    Сообщения:
    1.385
    Адрес:
    Ukraine
    Код (Text):
    1. cmp    [uMsg],WM_TIMER
    2.     je    .wm_timer
    3.     cmp    [uMsg],WM_DESTROY
    4.     je    .wm_destroy
    5.     jmp  .finish ;;!!!!!!!!!!!!!!
    6.     .wm_create:
     
  9. kb_08h

    kb_08h New Member

    Публикаций:
    0
    Регистрация:
    16 окт 2005
    Сообщения:
    17
    Адрес:
    Kyiv
    2 FreeManCPM:
    спасибо. =)