Реализация резидентной программы на языке Ассемблер




 

Проверка активности резидента, нажатия клавиши:

 

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; конец программы

 


 

Приложение Д

 

(обязательное)



Поделиться:




Поиск по сайту

©2015-2024 poisk-ru.ru
Все права принадлежать их авторам. Данный сайт не претендует на авторства, а предоставляет бесплатное использование.
Дата создания страницы: 2020-04-01 Нарушение авторских прав и Нарушение персональных данных


Поиск по сайту: