Проверка активности резидента, нажатия клавиши:
mov AL, activeAL, ALinactive_continueAL, pressedAL, ALshort key_downpressed, 0short inactive_continue
Если клавиша нажата:
key_down:
call shift_lightset_light
mov pressed, 1
Сдвиг и установка лампочки:
shift_light proc nearAL, lightAL, 1AL, 70hnot_shiftedAL, 40h
_shifted:light, AL_light endp
_light proc nearAX, AXES, AXAL, ES:[0417h]AL, 8FhAL, lightES:[0417h], AL_light endp
Чтение состояния клавиатуры и проверка нажатия “горячих клавиш”, приостанавливающих резидента:
mov AL, byte ptr ES:[0417h]AL, 6hAL, 6hnotPressedAL, activeAL, 1 active, AL
Тестирование и отладка резидентной программы
В приложении Д приведён скриншот результата выполнения программы. Из приведённого скриншота видно, что программа сообщает о своём запуске, опознаёт и сообщает, что программа уже загружена резидентно и переключает состояние клавиш Caps Lock, Num Lock и Scroll Lock при нажатии на клавишу.
Заключение
В данном курсовом проекте была разработана программа, изменяющая состояние управляющих клавиш: Caps Lock, Scroll Lock и Num Lock. Программа может использовать клавиатуру по-разному. Она может задержать своё выполнение, до тех пор, пока оператор не нажмёт какую-нибудь клавишу.
Список используемой литературы:
1. Финогенов К.Г. Самоучитель по системным функциям MS DOS. - М.: Радио и связь, Энтроп, 1995. - 382 с., ил.
. Зубков С.В. Assembler. Язык неограниченных возможностей. - М.: ДМК Пресс, 1999. - 608 с., ил.
. Пирогов В.Ю. Assembler. Учебный курс. - М.: Издатель Молгачева С.В., Издательство Нолидж, 2001. - 848 с., ил.
Приложение А
(обязательное)
Приложение Б
(обязательное)
Приложение В
(обязательное)
Приложение Г
(обязательное)
model tinysegment; определение кодового сегментаCS:code, DS:code; CS и DS указывают на сегмент кода100h
|
; резидентная часть программы
:init; переход на секцию инициализации
; данные резидентной части программы:F dd?; сохраненный обработчик 2Fhdd?; сохраненный обработчик 09h db 0; флаг активности резидента
; int 09h получает управление дважды: при нажатии и при отжатии клавиши. Чтобы срабатывало при нажании,
; используется флаг:db 0; клавиша нажата/отпущена (0 - нажата, 1 - отпущена)
; лампочки контролируются битами 4,5,6 байта [0040h:0017h]
; бит 5 (00100000b) - NumLock
; бит 6 (01000000b) - CapsLock
; бит 4 (00010000b) - SrollLockdb 20h; маска лампочек (00100000b) - NumLock On
; обработчик прерывания клавиатуры 09hHandler:ESAXAL, active; проверяем активность нашего резидентаAL, ALinactive_continue; неактивен? ничего не делаемAL, pressed; нажата клавиша или отпущена?
or AL, ALshort key_down; если нажата - переходpressed, 0; отпущена - сбросить флажокshort inactive_continue
key_down:; при нажатии клавиши:shift_light; сдвинуть лампочкуset_light; и установить ееpressed, 1; и поставить флажок нажатия
inactive_continue: dword ptr CS:old09; перейти на сохраненный обработчикAX, AXES, AXAL, byte ptr ES:[0417h]
and AL, 6h; проверяем одновременное нажатие клавиш (вкл/выкл резидента)
cmp AL, 6h; 110b - биты 1 и 2 - Ctrl + Left Shift
jne notPressedAL, activeAL, 1; переключаем состояние резидента (активен/неактивен)
mov active, AL
:AX ES
iret
; обработчик мультиплексного прерывания 2FhFHandler:AX, 0CDBAh; сравнить с магическим значениемnextRetryAL, 0FFh; совпадает - занести в AL сигнал 0FFh; и сразу возврат из прерывания
: CS:old2F; перейти на сохраненный обработчик
; процедура сдвига горящей лампочки на 1
; код лампочки в light_light proc nearAL, lightAL, 1; shift to right AL, 70h; выделяем биты лампочек - 01110000bnot_shifted; если какая-то лампочка горит - переход
|
mov AL, 40h; иначе установить 01000000b-CapsLock On
_shifted:light, AL_light endp
; процедура установки горящей лампочки
; код лампочки хранится в light
set_light proc nearAX, AXES, AXAL, ES:[0417h]
and AL, 8Fh; очищаем биты лампочек, сохраняем остальные битыAL, light; ставим маску горящих лампочек
mov ES:[0417h], AL_light endp
end_resident:; метка для определения размера резидентной части программы
; ================================================================================
; транзитная часть программы
:
; 1. проверка установленной программы
AX, 0CDBAh; магическое значение2Fh; вызов мультиплексного прерыванияAL, 0FFhinstalled; уже установлена - на выход
; 2. установка программы:
; перехват вектора 09h
AX, 3509h; получение адреса старого обработчика
Приложение Г
(обязательное)21hword ptr old09, BX; сохранение смещения обработчикаword ptr old09 + 2, ES; сохранение сегмента обработчикаAX, 2509h; установка адреса нашего обработчикаDX, offset int09Handler; указание смещения нашего обработчика21h
; перехват вектора 2Fh
AX, 352Fh; получение адреса старого обработчика21hword ptr old2F, BX; сохранение смещения обработчикаword ptr old2F + 2, ES; сохранение сегмента обработчикаAX, 252Fh; установка адреса нашего обработчикаDX, offset int2FHandler; указание смещения нашего обработчика
int 21h
; включить лампочку NumLock
set_light
mov AH, 09h; вывод на экран успешного сообщения
mov DX, offset DoneResident
int 21h
; установка резидентом
AX, 3100h; функция DOS завершения резидентной программыDX, (end_resident - start + 10Fh) / 16; определение размера резидентной части программы в параграфах21h
:AH, 09h; вывод на экран ругательного сообщения
mov DX, offset JustInstalledMsg21h
mov AX, 4C01h; завершить нерезидентно21h
JustInstalledMsg db 'Programma uzhe ustanovlena!', 13, 10, '$'db 'Programma ostalas rezidentno.', 13, 10, '$'
code ends; конец кодового сегментаstart; конец программы
Приложение Д
(обязательное)