Ассемблер для Windows



         

Таймеры в консольном приложении - часть 2


; атрибуты цветов FOREGROUND_BLUE equ 1h ; синий цвет букв FOREGROUND_GREEN equ 2h ; зеленый цвет букв FOREGROUND_RED equ 4h ; красный цвет букв FOREGROUND_INTENSITY equ 8h ; повышенная интенсивность BACKGROUND_BLUE equ 10h ; синий свет фона BACKGROUND_GREEN equ 20h ; зеленый цвет фона BACKGROUND_RED equ 40h ; красный цвет фона BACKGROUND_INTENSITY equ 80h ; повышенная интенсивность

COL1 = 2h+8h ; цвет выводимого текста

; прототипы внешних процедур EXTERN wsprintfA:NEAR EXTERN GetStdHandle@4:NEAR EXTERN WriteConsoleA@20:NEAR EXTERN SetConsoleCursorPosition@8:NEAR EXTERN SetConsoleTitleA@4:NEAR EXTERN FreeConsole@0:NEAR EXTERN AllocConsole@0:NEAR EXTERN CharToOemA@8:NEAR EXTERN SetConsoleCursorPosition@8:NEAR EXTERN SetConsoleTextAttribute@8:NEAR EXTERN ReadConsoleA@20:NEAR EXTERN timeSetEvent@20:NEAR EXTERN timeKillEvent@4:NEAR EXTERN ExitProcess@4:NEAR

; директивы компоновщику для подключения библиотек includelib c:\masm32\lib\user32.lib includelib c:\masm32\lib\kernel32.lib includelib c:\masm32\lib\winmm.lib ;------------------------------------------------------------

COOR STRUC X WORD ? Y WORD ? COOR ENDS

; сегмент данных _DATA SEGMENT DWORD PUBLIC USE32 'DATA' HANDL DWORD ? HANDL1 DWORD ? STR2 DB "Пример таймера в консольном приложении",0 STR3 DB 100 dup (0) FORM DB "Число вызовов таймера: %lu",0 BUF DB 200 dup (?) NUM DWORD 0 LENS DWORD ? ; количество выведенных символов CRD COOR <?> ID DWORD ? ; идентификатор таймера HWND DWORD ? _DATA ENDS

; сегмент кода _TEXT SEGMENT DWORD PUBLIC USE32 'CODE' START: ; образовать консоль ; вначале освободить уже существующую CALL FreeConsole@0 CALL AllocConsole@0 ; получить HANDL1 ввода PUSH STD_INPUT_HANDLE CALL GetStdHandle@4 MOV HANDL1,EAX ; получить HANDL вывода PUSH STD_OUTPUT_HANDLE CALL GetStdHandle@4 MOV HANDL,EAX ; задать заголовок окна консоли PUSH OFFSET STR2 CALL SetConsoleTitleA@4 ; задать цветовые атрибуты выводимого текста PUSH COL1 PUSH HANDL CALL SetConsoleTextAttribute@8 ; установить таймер PUSH TIME_PERIODIC ; периодический вызов PUSH 0 PUSH OFFSET TIME ; вызываемая таймером процедура PUSH 0 ; точность вызова таймера PUSH 1000 ; вызов через одну секунду CALL timeSetEvent@20 MOV ID, EAX ; ждать ввод строки PUSH 0 PUSH OFFSET LENS PUSH 200 PUSH OFFSET BUF PUSH HANDL1 CALL ReadConsoleA@20 ; закрыть таймер PUSH ID CALL timeKillEvent@4 ; закрыть консоль CALL FreeConsole@0 PUSH 0 CALL ExitProcess@4




Содержание  Назад  Вперед