Анимация
JavaScript


Главная  Библионтека 

0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 [ 15 ] 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88

StartNew21h:

jmp cs: 01d21h Обработчик прерывания 60h ===========

New60h:

iret

;==== Секция установки =

TailRemove

TailSet DB ,

TailClear

MesRem

MesErr

MessErrKey

Meslnfo DB

/R - E

Meslns

MesAlr

/R /С

ПРОГРАММА MyTSR.COM ВЫГРУЖЕНА ИЗ ПАМЯТИ, 10, 13, $ ПРОГРАММА MyTSR.COM НЕ ЗАГРУЖЕНА, 10, 13, $ НЕПРАВИЛЬНЫЙ КЛЮЧ! , 10, 13 ПРАВИЛЬНЫЕ КЛЮЧИ: , 10, 13

;==== Макроопределение CmpTail MACRO Tail mov mov mov

repz cmpsb

ENDM

;==== Макроопределение OutStr MACRO

mov mov int ENDM

/S - АКТИВИЗАЦИЯ , 10, 13 /С - ПАРАЛИЗАЦИЯ, 10, 13, ПРОГРАММА MyTSR.COM ЗАГРУЖЕНА, 10, 13, $ ПРОГРАММА УЖЕ ЗАГРУЖЕНА, 10, 13 $

поиск ключа ===============------=

сх, 3 di, 81h

si, OFFSET Tail

вывод строки ====

MyStr

ah, 09h

dx, OFFSET MyStr 21h

Install:

jnz Init ; Получим "хвост" команды из PSP

mov cl, es: 80h

cmp cl, 0

jz Already

cmp cl, 3

jnz ErrKey

CmpTail TailRemove

jz Unlnstall

CmpTail TailSet

jz SetMyTSR

CmpTail TailClear

jz ClearMyTSR

ErrKey: OutStr MesErrKey ExitOl: mov 4c01h

int 21h ; Активизация программы SetMyTSR: mov ax, 0DD02h

int 2Fh ExitOO: mov ax, 4C00h

int 21h ; Парализация программы ClearMyTSR: mov ax, 0DD03h

int Ш

jmp ExitOO ; Выгрузка программы Unlnstall; mov ax, ODDOlh

int 2Fh

OutStr MesRem

jmp ExitOO ; Вывод сообщения о невозможности повторной установки Already: OutStr MesAlr

jmp ExitOl ;Установка программы в памяти

Init:

; Установка ВП 60h

ах, 3560h 21h

WORD PTR Old60h, bx WORD PTR Old60h+2, es ax, 2560h dx, OFFSET New60h 21h

Проверка присутствия в памяти mov ах, ODDOOh int 2Fh

cmp al, OFFh; Анализ кода возврата

mov int mov mov mov mov int

Установка ВП 2Fh

mov ax, 352Fh int 21h

mov WORD PTR 01d2Fh, bx



mov WORD PTR 01d2Fh+2, es

mov ax, 252Fh

mov dx, OFFSET New2Fh

int 21h

Память

Установка ВП 21h

mov ax, 3521h int 21h

mov WORD PTR 01d21h, bx mov WORD PTR 01d21h+2, es mov ax, 2521h mov dx, OFFSET New21h-int 21h

Вывод сообщения об успешной установке программы и завершение OutStr Meslns OutStr Meslnfo

mov dx, OFFSET TailRemove int 27h END Begin

Примечания.

1) Размер "хвоста" хранится в ячейке PSP со смещением 80h, "хвост" хранится в ячейках PSP, начиная с ячейки со смещением 81h, завершается "хвост" кодом ODh.

2) Любая программа, загруженная в память, состоит из двух блоков: собственно программы и ее окружения. Сегментный адрес окружения хранится в ячейке PSP со смещением 2Ch.

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

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

Для того чтобы прикладные программы могли использовать прерывание от системного таймера, в системе предусмотрено программное прерывание ICh, вызов INT ICh которого содержится в программе BIOS отсчета времени (рис. 1.3.10). Вектор этого прерывания (OFOOOh: 0FF53h) суть адрес программы-заглушки, содержащей одну команду IRET. Если пользователь запишет в ВП ICh адрес собственного обработчика, каждый раз при возникновении прерывания от таймера (18,2 раза в сек) управление будет получать его обработчик.

Прерывание от таймера 18,2 раза в секунду

Таблица векторов прерываний

ВП08И

BniCh

Программа BIOS отсчета времени

int ICh

Прикладной обработчик npepweamnrlCh

Рис. 1.3.10. Использование прерьвания от системного таймера в прикладной программе Прерывание от таймера используется обычно в двух случаях:

разработка TSR-программ, активизирующихся при наступлении каких-либо собы в реальном масштабе времени;

активизация каких-либо функций TSR-программ, отложенных по каким-либо npi нам, например по соображениям безопасности.

Каждый раз, когда мы нажимаем или отпускаем любую клавишу (рис. 1.3.11), троллер клавиатуры формирует скен-код (или в некоторыъх редких случаях послед тельность скен-кодов), который идентифицирует не только саму клавишу, но и прои Денное с ней действие (нажатие или отжатие).



Ассемблер в задачах защиты un$oP;;*.f4uu

40h: lAh

Головной указатель

Кольцевой буфер ввода 15 слов

Скен

Скен

ASCn

ASCn

INTA f

Контроллер прерываний

Тип

-1 -

ПЗУ BIOS

Нажатие или

Скен-код

Обработчик прерывания

отжатие клавиши .

Контроллер

от клавиатуры

клавиатуры

1) Считывание скен-кода

2) Подтверждение ввода

Подтверждение

ОВППЛ

40h: 18h 40h:17h

3) Работа со словом флагов и кольцевым буфером ввода

4) Приказ EOI

Слово флагов клавиатуры 1

TQFT

40h: lEh

40h: 3Ch

40h: iCh

Хвоаовой указатель

Прикладная программа intl6h

Драйвер клавиатуры BIOS

Puc. 1.3.11. Взаимодействие системы с клавиатурой

Затем контроллер вырабатьшает запрос внешнего аппаратного прерывания (с номером 09h), поступающий на вход IRQ1 контроллера прерываний. Системный обработчик прерывания 09h, получив управление, осуществляет следующую последовательность действий:

считывает скен-код нажатой клавиши;

посылает сигнал подтверждения ввода обратно в контроллер клавиатуры;

анализирует состояние управляющих клавиш, считывая слово флагов клавиатуры (40h: 18h - адрес старшего байта, 40h: 17h - адрес младшего байта);

анализирует состояние хвостового указателя (адрес 40h: ICh) осуществляет запись слова (скен-ASCII или расширенный код ASCII) в кольцевой буфер клавиатурь! (адреса40h: lEh ... 40h: 3Ch);

Глава 1 Основы программирования на Ассемблере IBM PC ICJ

0 формирует сигнал EOI для контроллера прерываний.

Прикладная программа, желающая получить код нажатой клавиши, по команде IN l6h вызывает драйвер клавиатуры BIOS. Последний анализирует состояние головног указателя (адрес 40h: 1 Ah) и осуществляет ввод информации из кольцевого буфера.

Многие резидентные программы используют для своего запуска прерывание от кл; виатуры. Эта ситуация носит название активизацш по "горячей"клавише.

Во избежание конфликтов прикладная программа при перехвате системных прерь ваний должна стремиться передавать управление системному обработчику. Это отн( сится и к перехвату прерываний от клавиатуры. Однако при перехвате прерывания OS бывают ситуации, когда приходится полностью отказываться от обычной реакции i это прерывание. В этом случае прикладной обработчик обязан сам выполнить дейс ВИЯ, являющиеся обязательными для любого обработчика прерывания 09h. Этими де; ствиями являются:

Ш подтверждение ввода кода символа - формирование импульса на старшей линии по

та ВВ 61h контроллера клавиатуры; Ш посылка приказа EOI в контроллер прерывания.

Примеры

==== Структура прикладной программы с обработчиком прерывания ICh. ==== Time - время задер в секундах. ============================

; Обработчик прерывания ICh

NewlCh:

cs: FlagEn, 1

OutOfHandlerlCh

cs: Count

cs: Count, 0

OutOfHandlerlCh

cs: FlagEn, 1

OutOfHandlerlCh:

iret

FlagEn

Count

Time*18

Прикладная программа

NextCheck:

cs: FlagEn, 0

NextCheck

Повторяем цикл

до обнаружения FlagEn = 1

~-== Структура прикладного обработчика 09h, полностью ~ ~ исключающего системную обработку при нажатии ==== на "горячую" клавишу со скен-кодом МуКеу. =======



0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 [ 15 ] 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88