Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Абель.docx
Скачиваний:
13
Добавлен:
26.11.2018
Размер:
569.84 Кб
Скачать

Int 27h или функцию dos 31н. Для int 27н следует передать системе в

регистре DX размер программы:

MOV DX,prog-size

INT 27H

При выполнении программы инициализации DOS резервирует (выделяет) в

старших доступных адресах блок памяти и загружает в него резидентную

программу. Это наиболее простая часть создания резидентной программы.

Более сложная часть включает программирование механизма активизации

резидентной программы, которая хотя и присоединена к DOS, но не является

внутренней программой DOS, как DIR, COPY или CLS. Общим подходом является

модификация таблицы векторов прерываний таким образом, чтобы резидентная

программа, получала управление при нажатии определенных клавиш или их

комбинаций, а все остальные передавала через себя. Резидентная программа

обычно (но не обязательно) состоит из следующих частей:

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