Индивидуальные задания. Резидентные программы
Резидентные программы
________________________________
Существуют программы, специально разработанные так, чтобы находиться в памяти во время работы других программ. Обычно эти программы можно активизировать нажатием определенных клавиш. Такие программы называются резидентными. Обычно они загружаются в память сразу после загрузки DOS перед выполнением обычных программ.
Чтобы оставить резидентную COM-программу в памяти, необходимо вместо команды RET или INT 20H для выхода использовать команду INT 27H или функцию DOS 31Н. Для INT 27Н следует передать системе в регистре DX размер программы:
MOV DX,prog-size
INT 27H
При выполнении программы инициализации DOS резервирует (выделяет) в старших доступных адресах блок памяти и загружает в него резидентную программу. Это – самая простая часть создания резидентной программы.
Более сложная часть включает программирование механизма активизации резидентной программы, которая хотя присоединена к DOS, но не относится ко внутренним программам – командам DOS (как DIR, COPY и пр.). Общий подход к этому – модификация таблицы векторов прерываний так, чтобы резидентная программа получала управление при нажатии определенных клавиш или их комбинаций, а все остальные передавала через себя дальше. Резидентная программа обычно (но не обязательно) состоит из следующих частей:
1) секция, переопределяющая адреса в таблице векторов прерываний;
2) процедура, выполняемая только один раз при загрузке программы и обеспечивающая:
- замену адреса в таблице векторов прерываний на собственный адрес;
- установку размера части программы, которая должна стать резидентной;
- использование прерывания DOS для завершения программы и создания резидентной части по указанному размеру;
3) процедура, которая остается резидентной и активизируется, например, по вводу с клавиатуры или по сигналам таймера.
Процедура инициализации должна создать необходимые условия для обеспечения работы резидентной программы, а затем позволить себе быть стертой в памяти. В итоге память распределится следующим образом:
Таблица векторов прерываний
IВМВIO.СОМ и IBMDOS.COM
COMMAND.СОМ
Резидентная часть программы – остается в памяти
Инициализирующая часть программы – перекрывается следующей программой
Остальная часть доступной памяти
________________________________
TITLE RESIDENT (COM) Резидентная программа для очистки
; экрана и установки цвета при нажатии
; Alt+Left Shift
;----------------------------------------------------------
INTTAB SEGMENT AT 0H ;Таблица векторов прерываний:
ORG 9H*4 ; адрес для Int 9H,
KBADDR LABEL DWORD ; двойное слово
INTTAB ENDS
;----------------------------------------------------------
ROMAREA SEGMENT AT 400H ;Область параметров BIOS:
ORG 17H ; адрес флага клавиатуры,
KBFLAG DB ? ; состояние Alt + Shift
ROMAREA ENDS
;----------------------------------------------------------
CSEG SEGMENT PARA ;Сегмент кода
ASSUME CS:CS
ORG 100H
BEGIN: JMP INITZ ;Выполняется только один раз
KBSAVE DD ? ;Для адреса INT 9 BIOS
; Очистка экрана и установка цветов:
; ---------------------------------
COLORS PROC NEAR ;Процедура выполняется
PUSH AX ; при нажатии Alt+Left Shift
PUSH BX
PUSH CX ;Сохранить регистры
PUSH DX
PUSH SI
PUSH DI
PUSH DS
PUSH ES
PUSHF
CALL KBSAV ;Обработать прерывание
ASSUME DS:ROMAREA
MOV AX,ROMAREA ;Установить DS для
MOV DS,AX ; доступа к состоянию
MOV AL,KB AG ; Alt+Left Shift
CMP AL,00001010B ;Alt+Left Shift нажаты?
JNE EXIT ; нет - выйти
MOV AX,0600H ;Функция прокрутки
MOV BH,61H ;Установить цвет
MOV CX,00
MOV DX,18 FH
INT 10H
EXIT:
POP ES ;Восстановить регистры
POP DS
POP DI
POP SI
POP DX
POP CX
POP BX
POP AX
IRET ;Вернуться
COLORS ENDP
; Подпрограмма инициализации:
; --------------------------
INITZE PROC NEAR ;Выполнять только один раз
ASSUME DS:INTTAB
PUSH DS ;Обеспечить возврат в DOS
MOV AX,INTTAB ;Установить сегмент данных
MOV DS,AX
CLI ;Запретить прерывания
;Замена адреса обработчика:
MOV AX,WORD PTR KBADDR ;Сохранить адрес
MOV WORD PTR KBSAVE,AX ; BIOS
MOV AX,WORD PTR BADDR+2
MOV WORD PTR KBSAVE+2,AX
MOV WORD PTR KBADDR,OFFSET COLORS ;Заменить
MOV WORD PTR KBADDR+2,CS ; адрес BIOS
STI ;Разрешить прерывания
MOV DX,OFFSET INITZE ;Размер программы
INT 27H ;Завершить и остаться
INITZE ENDP ; резидентом
CSEG ENDS
END BEGIN
________________________________
Рис. 1. Резидентная программа
Пример на рис. 1 иллюстрирует резидентную программу, которая устанавливает цвет экрана при одновременном нажатии клавиш Alt и Left Shift. Основные моменты, представляющие интерес:
- Сегмент INTTAB определяет таблицу векторов прерываний, начинающуюся по адресу 0, а точнее – адрес элемента для прерывания 9 (ввод с клавиатуры), названный в программе KBADDR.
- Имя ROMAREA определяет сегмент, начинающийся по адресу 400Н, и в нем флаговый байт клавиатуры (KBFLAG), который отражает состояние клавиатуры. Бит 3 в этом байте регистрирует нажатие клавиши Alt, бит 1 – нажатие клавиши Left Shift.
- Сегмент CSEG начинает сегмент обычной COM-программы. Первая выполняемая команда JMP INITZE обходит резидентную часть и передает управление в процедуру инициализации (INITZE) в конце программы. Эта процедура устанавливает в регистре DS адрес таблицы векторов прерывания (INTTAB) и передает адрес элемента таблицы для INT 9 (KBADDR) в поле KBSAVE в резидентной процедуре. Следующим шагом в таблице в KBADDR устанавливается адрес резидентной процедуры (COLORS) (первое слово) и содержимое регистра CS (второе слово). Таким образом, KBADDR содержит теперь два измененных слова: смещение и значение адреса из регистра CS, которые вместе определяют адрес процедуры COLORS в памяти, куда будут направляться теперь все символы, поступающие с клавиатуры. Затем процедура инициализации заносит в регистр DX размер процедуры COLORS (адрес INITZE на один байт больше, чем адрес конца процедуры COLORS) и прекращает работу, используя INT 27H.
- Процедура COLORS является резидентной и получает управление при нажатии любой клавиши на клавиатуре. Так как это происходит при работе других программ (например, DOS или текстового редактора), процедура должна сохранить все регистры, которые она использует (а также несколько других на всякий случай). Затем происходит вызов по адресу KBSAVE, т.е. вызов подпрограммы обработки прерывания, после чего процедура проверяет флаг клавиатуры для определения нажатия клавиш Alt и Left Shift. Если эти клавиши были нажаты, то процедура устанавливает необходимые цвета. Завершающие команды включают восстановление всех запомненных вначале регистров (в обратной последовательности) и выход из обработки прерывания по команде IRET.
Приведенная программа носит иллюстративный характер, ее можно модифицировать или расширить для собственных целей.
________________________________
________________________________
Индивидуальные задания
Написать резидентную программу по образцу из файла «Резидентные программы.doc». Программа должна выдавать на экран в заданную позицию заданное сообщение при нажатии на определенную клавишу. Позиция экрана, сообщение и «горячая клавиша» выбираются согласно варианту.
номер варианта | позиция экрана | сообщение | клавиша | |
X | Y | |||
DOS | Tab | |||
Number | F1 | |||
??? | End | |||
Hi | Ctrl | |||
Good | Alt | |||
Bad | F7 | |||
Lmn | BKSP | |||
Zip | F5 | |||
skip | Del | |||
OK | F9 | |||
Linux | Tab | |||
UNIX | F1 | |||
Head | End | |||
Logic | Ctrl | |||
Go | Alt | |||
F7 | ||||
Scroll | BKSP | |||
Shift | F5 | |||
Up | Del | |||
Down | F9 | |||
Left | Tab | |||
Right | F1 | |||
Stupid | End | |||
Good | Ctrl | |||
Save | Alt | |||
Cat | F7 | |||
Value | BKSP | |||
RAR | F5 | |||
Ace | Del | |||
Seven | F9 |