Анимация
JavaScript
|
Главная Библионтека StartNew21h: jmp cs: 01d21h Обработчик прерывания 60h =========== New60h: iret
/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
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:
Повторяем цикл до обнаружения 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 |