Анимация
JavaScript
|
Главная Библионтека iret ;===== Прикладная обработка выполняется до системной ====== Oldint DD ? Newint: ; Прикладная обработка jmp DWORD PTR cs: Oldint ; Команда IRET не нужна, она ; есть в системном обработчике ;==== Определение собственного стека в обработчике прерывания. ==== ALIGN MyStack DB 200h DUP (?) ; Локальный стек объемом 256 слов EndOfStack = $ OldSP DW OldSS DW ; Конец области стека ? ; Ячейки для хр4,нения ? ; "старого" содертамого SS и SP MyHandler: push raov mov mov iret cs: OldSS, SS cs: OldSP, sp OFFSET EndOfStack-2 SS, cs: OldSS sp, cs: OldSP Сохранение "старого" содержимого SS и SP SS; SP указывают на последнее слово в стеке Восстановление SS и SP перед возвратом из обработчика Примечания. 1) Последовательности команд, изменяющих содержимое SS: SP, не произвольны: необходимо предотвратить возможность прерывания во время выполнения этих действий, что может привести к разрушению системы. 2) В, вышеприведенном примере это обеспечивается за счет использования того факта, что ЦП не анализирует сигнал на входе INT при выполнении команд MOV и POP, изменяющих содержимое сегментного регистра. 3) Директива ALIGN гарантирует, что стек начнется с границы слова, т.е. с четного адреса. J 3.5. Резидентные программы Большой класс программ, например, драйверы устройств, программы шифровани и зашиты данных и многие другие, должны постоянно находиться в памяти и мгновенн реагировать на запросы пользователя или на какие-либо события, происходящие в сис теме. Такие программы носят название резидентных или TSR - Terminate and Sta Resident. Сделать резидентной можно как программу типа .ЕХЕ, так и программу тип СОМ, однако, учитывая, что резидентная программа должна быть максимально ко\ пактной, обычно в качестве резидентных используют программы типа .СОМ. Резидентные программы обычно состоят из двух частей - установочной и резидет ной. При первом вызове TSR-программы она загружается в память целиком и управл* ние передается секции установки, которая заполняет или модифицирует вектора прерь ваний, настраивает программу на конкретные условия работы, анализируя переданные е параметры и с помощью либо прерывания 21h с функцией 31h, либо прерывания 27 завершает программу, оставляя в памяти ее резидентную часть, после чего система пер( ходит в исходное состояние. Для того чтобы активизировать резидентную программу, ей надо как-то передап управление и, в случае необходимости, параметры. Запустить резидентную программ можно тремя способами: вызвать ее оператор5>м CALL как подпрограмму; использовать механизм аппаратных прерываний; использовать механизм программных прерываний. Кроме того, специально для взаимодействия с TSR-программами предусмотрег мультиплексное прерывание 2Fh. Типичная структура резидентной программы на языке ассемблера IBM PC показа! на рис. 1.3.9, из которого видно, что TSR-программа имеет как минимум две точки вх( да. Реальные TSR-программы перехватывают целый ряд аппаратных и программнь прерываний и поэтому имеют не одну точку входа активизации, а несколько. Точка входа-при запуске Точка входа-"Риактивизации По прерыванию - jmp Install MyHander: Install: raov dx, OFFSET Install int 27h Резидентная чааь Отбрасывается после установки 1.3.9. Структура TSR-программы Для обращения к резидентной программе из транзитной можно использовать: Я область межзадачных связей, являющуюся частью области данных BIOS (адреса 40h; F0h...40h: FFh); свободные или уже занятые системой вектора прерьшаний (ВП). Если TSR-программа запускается по нажатию клавиши, возникает проблема взаимодействия с системным обработчиком прерываний от клавиатуры, а также другими про-фаммами, перехватывающими прерывание 09h. Для взаимодействия с резидентными профаммами в системе предусмотрено специальное прерывание 2Fh. Перед вызовом INT 2Fh в регистр АН следует поместить номер функции (функции пользователя - OCOh...OFFh), а в регистр AL - номер подфункции. Прерывание 2Fh используется чаще всего для защиты от повторной установки и передачи уже зафуженной профамме приказа на выфузку. Для того чтобы TSR-профамма реагировала на прерывание 2Fh, в нее следует включить обработчик функций этого прерывания. Наиболее простой способ выфузки TSR-профаммы из памяти - освобождение блоков памяти, занимаемых профаммой и ее окружением с помощью функции 49h прерывания INT 21h. Перед освобождением памяти необходимо восстановить все ВП, "перехваченные" резидентной профаммой. Восстановление ВП иногда является неразрешимой задачей. Правильно восстановить "старое" содержимое ВП можно лишь в том случае, если этот вектор не был позже перехвачен другой резидентной профаммой. Если же это произошло, в таблице ВП находится адрес не выфужаемой, а следующей TSR-профаммы, которая "повиснет", лишившись средств своего запуска, если восстановить "старое" содержимое ВП. Следовательно, прежде чем удалять TSR-профамму, необходимо убедиться в том, что она находится на вершине списка обработчиков прерываний, или, другими словами, ни одно из прерываний, используемых профаммой, не было впоследствии перехвачено другой профаммой. 1.3.6. Системные средства поддержки резидентных программ INT 27h Завершить программу и оставить ее резидентной При вызове: CS - сегментный адрес PSP; DX - относительный адрес первого отбрасываемого байта. Примечание Прерывание 2 критической 0U INT21h, функция 25h Устаковка вектора прерываин) При вызове: АН = 25h; AL - номер прерывания; DS : DX - адрес обработчика прерывания (вектор прерывания). INT 21 h, функция 31 h При вызове: АН = 31h; AL - код возврата; Завершить программуиоставнтьёе резиденте DX - размер резидентйй секции в парафафах (парафаф - область байтов). INT21h, функция 35h памяти объемом К Чтение вектора прерывани) При вызове: АН = 35h; AL - номер прерывания. При возврате: ES : ВХ - адрес обработчика прерывания (вектор прерывания). 1NT 21Н, функция 49h При вызове: Освободить область памят! АН = 4 9h; сегментный адрес освобождаемого блока памяти. При возврате: CF = О - ошибок нет; CF = 1 - ошибка, АХ - код ошибки. Пример OutOfHandler2Fh: Alreadylns: Программа MyTSR перехватывает прерывания 2Fh, 21h и 60h и имеет четыре, точки входа: при запуске из командной строки и по командам INT 2Fh, INT 21h и INT 60h. Используемые ключи: /R - выгрузка (Remove), .. /S - активизация (Set), /С - парализация (Clear). Используется функция ODDH прерывания 2FH с подфункциями: 0 - проверки на повторную установку, 1 - выгрузки, 2 - активизации и 3 - парализации. При обнаружении системой команды INT 21h управление передается на метку New21h. Происходит анализ флага EnableTSR. Если он равен единице, т.е. TSR-программа активна, управление передается на прикладной обработчик прерывания 21h, который "сцепляется" с системным обработчиком и поэтому завершается командой jmp cs: 01d21h. Если флаг EnableTSR = О, управление сразу передается на "старый" обработчик прерывания 21h. . MODEL tiny . CODE ORG lOOh cmp jz cmp jmp mov SetTsT активизации ? al 03h • Если да, на активизацию ClearTSR : I ""ФУдая парализации 7 ClearTSR, Если да, на парализацию cs: 01d2Fh al, OFFh; Код присутствия в памяти первой ; копии программы iret ;==== Выгрузка программы из памяти ================================= Remove: ; Сохраним используемые регистры push ds es dx ; Восстановим все перехваченные вектора прерываний mov ах. 7ЧйГ>к ==== Резидентная секция Begin: 01d21h 01d2Fh Old60h EnableTSR Install > ) 0 Точка входа при запуске Ячейки для хранения "старых" ВП 21h, 2Fh, 60h Флаг разрешения работы программы ;==== Обработчик прерывания 2Fh ========== New2Fh: cmp ah, ODDh ; Наша функция ? jnz OutOfHandler2Fh ; Если нет, на выход из обработчика cmp al, OOh ; Это подфункция проверки на ; повторную установку? J2 Alreadylns ; Если да, на подтверждение ; наличия первой копии cmp al, Olh ; Это подфункция выгрузки ? -jz Remove ; Если да, на выгрузку tTSR: mov ClearTSR; mov Ids int mov Ids int mov Ids int lh ;Выгрузим окружение mov es, cs: mov ah, 49h int 21h ;Выгрузим саму программу push cs pop es mov ah, 49h int 21h ;Восстановим регистры pop dx es ds iret ax, 2560h ds, cs: Old60h 21h ax, 252Fh dx, cs: 01d2Fh 21h ax, 2521h ds, cs: 01d21h cs: EnableTSR, 1 ; Активизация программы iret mov cs: EnableTSR, 0 ; Парализация программы iret == Обработчик прерывания 21h ==================================== **21h: cmp , cs: EnableTSR, 1 ; Программа активна ? jz StartNew21h ; Если да, на прикладную 0„„„ ; обработку прерывания 21Н jmp cs: 01d21h Handler21h: 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 |