Сборник по задачам и примерам Assembler



Минимальная программа консольного приложения - часть 8


:prg05_12.asm - программа, демонстрирующая использование пользовательского обработчика события.

.data

Text_CTRL_C db "Нажаты CTRL+C"

Len_Text_CTRL=$-Text_CTRL_C

TextJREAK db "Нажаты CTRL+BREAK"

Len_BREAK=$-Text_BREAK

.code

CtrlHandler proc

arg @@dwCtrlType:DWORD

uses ebx.edi. esi ;эти регистры обязательно должны сохраняться

:анализируем тип сигнала управления

cmp @@dwCtrlType.CTRL_C_EVENT

je h_CTRL_C_EVENT

cmp (a@dwCtrlType.CTRL_BREAK_EVENT

je h_CTRL_BREAK_EVENT

jmp h_default

h_CTRL_C_EVENT: :при нажатии CTRL+C выводим сообщение: установим курсор

call SetConsoleCursorPosition :вывести строку Text_CTRL_C call WriteConsoleA

; возвращаем признак обработки

mov eax.l

jmp exit_CtrlHandler h_CTRL_BREAK_EVENT:
;при нажатии CTRL+BREAK выводим сообщение:

установим курсор

call SetConsoleCursorPosition : вывести строку

call WriteConsoleA

;возвращаем признак обработки

mov eax.l

jmp exit_CtrlHandler

h_default: mov eax.Offffffffh;возвращаем остальное не обрабатываем
exit_CtrlHandler: ret CtrlHandler endp start proc near ;точка входа в программу:

:работаем .........

:получим стандартные дескрипторы ввода-вывода

установим функцию-обработчик сигналов управления

push TRUE

push offset cs: CtrlHandler

call SetConsoleCtrlHandler

onp eax. 0

jz exit :если неуспех ;введем строку в буфер TitleText установим курсор в позицию (2.6)

call SetConsoleCursorPosition call ReadConsoleA

:выведем введенную строку в заголовок окна консоли: push offset TitleText call SetConsoleTitleA

:выведем строку в окно консоли с различных позиций и с разными цветами

mov ecx.10 :строку выведем 10 раз

mov bl.10000001b начальные атрибуты ml: push ecx установим курсор в позицию

call SetConsoleCursorPosition

определим атрибуты выводимых символов - будем получать их циклически сдвигом регистра BL хог еах.еах

rol Ы .1

mov al ,Ы

push eax

push d0ut

call SetConsoleTextAttribute . :вывести строку TitleText

call WriteConsoleA cmp eax.0

jz exit ;если неуспех pop ecx




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