Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
КНИГА_АСМ ассемблер.doc
Скачиваний:
61
Добавлен:
19.11.2019
Размер:
732.16 Кб
Скачать

Inst: mov ah, 9

mov dx, offset soob2

int 21h

mov ah,4ch

int 21h

; Область данных загрузочной части.

soob2 db 'Программа уже установлена$'

code ends

end f10

ПРОГРАММА 2. Перехватывает прерывание BIOS int 16h. Это прерывание возвращает в ax из буфера клавиатуры СКЭН и ASCII коды нажатой клавиши. Основная ветвь резидентной части программы реализует схему 2. То есть, попадая в наш резидент, мы сразу вызываем стандартный обработчик int 16h. Этот обработчик возвращает нам в ax код клавиши, с которым мы и работаем. Поскольку при этом возврат управления фоновой программе осуществляет наш резидент, он и должен обеспечить передачу (в регистре ax) полученного кода клавиши фоновой программе. В резидентной части программы имеется побочная ветвь, реализующая схему 1. Связано это с тем, что прерывание int 16h имеет целый ряд функций, из которых нам интересны только две: 0 и 10h. Остальные функции как раз и отсекаются этой побочной ветвью.

; Заголовок СОМ-программы

code segment

assume cs:code,ds:code

org 100h

; Переход на загрузочную часть программы

f10: jmp start

; Область данных резидентной части.

key dw 5555h ; ключ расположен в ячейке

; со смещением 103h (100h байт

; PSP и 3 байта jmp start)

soob db 'нажата Alt/T'

oldvect dd 0 ; здесь запоминаем адрес

; системного обработчика

; Здесь начинается резидентная часть программы. Очень важным является

; то, что когда мы попадаем сюда из фоновой программы, все сегментные

; регистры, кроме CS, содержат данные фоновой программы. Поэтому там,

; где используются команды, по умолчанию берущие базовый адрес из DS,

; необходимо использовать префикс замены сегмента CS:.

newvect:

; Сохраняем в стеке все регистры, которые можем испортить

push es

push bx

push cx

push dx push si push di

; Это функция 0 ?

cmp ah, 0 je resid

; Это функция 10h ?

cmp ah, 10h jne exit1 ; если «не наши» функции, отдаем управление системному ; обработчику

resid:

; Вызываем стандартный обработчик

pushf call cs:oldvect

; Если в AH вернулось 14h, а в AL - 0 -это код Alt/t.

cmp ax, 1400h

jne exit mov di, ax ; сохраняем код клавиши, чтобы вернуть его фоновой программе

; Запоминаем позицию курсора (в SI).

mov ah,3

mov bh,0

int 10h mov si, dx

; Выводим сообщение, начиная с текущей позиции курсора, что Alt/t нажата.

mov cx,12

mov bx,offset soob

m1: mov ah,0eh

mov al,cs:[bx]

int 10h

inc bx

loop m1

; Вводим задержку секунд на 5, чтобы полюбоваться надписью.

mov ah, 0

int 1ah

mov bx, dx

add bx, 50

m2: mov ah, 0

int 1ah

cmp bx, dx

ja m2

; Восстанавливаем курсор в старой позиции. Старые координаты берутся из SI.

mov dx, si

mov ah,2

mov bh,0

int 10h

; Стираем нашу надпись пробелами. Курсор при этом не смещается,

; а остается в нужной (старой) позиции.

mov ah,0ah

mov al,' '

mov cx,12

mov bh,0

int 10h

mov ax, di ; восстанавливаем код клавиши, который надо вернуть фоновой ; программе

exit:

; Восстанавливаем в регистрах информацию фоновой программы.

pop di

pop si

pop dx

pop cx

pop bx

pop es

; Возвращаем управление фоновой программе.

iret

; Возвращаем управление стандартному обработчику

exit1: pop di

pop si

pop dx

pop cx

pop bx

pop es

jmp cs:oldvect

; Здесь кончается резидентная часть и начинается загрузочная часть

; программы.

start:

; Получаем вектор правильного (системного) обработчика (в ES:BX).

mov ah,35h

mov al, 16h

int 21h

; Производим проверку (сравнивая с ключом) на повторную установку программы.

cmp word ptr es:[103h],5555h

jz inst

; Запоминаем вектор правильного (системного) обработчика.

mov word ptr oldvect,bx

mov word ptr oldvect+2,es

; Устанавливаем вектор своего обработчика.

mov dx,offset newvect

mov ah,25h

mov al, 16h

int 21h

; Завершаем программу, оставляя резидентной в памяти ее часть,

; от начала PSP до метки start.

mov dx,offset start

int 27h

; Если программа уже установлена в памяти, выдаем сообщение об

; этом и завершаем программу, ничего не оставляя в памяти.