Методическое руководство к курсовой работе по дисциплине Assembler ibm pc содержание

Вид материалаРуководство

Содержание


Endp new_1Bh Proc main
Endp main End main
TSR – программами
End) на начало процедуры resident
Prg5_res. Пассивный резидент с использованием прикладного программного обработчика прерывания с номером 61h
Подобный материал:
1   2   3   4   5   6   7   8   9
^

Endp new_1Bh

Proc main


mov ax,@data ;Установка в ds адреса

mov ds,ax ;сегмента данных

;Сохраним системные вектора 09h и 1Bh с помощью функции 35h

mov ax,3509h ;al=09h- номер вектора

int 21h

mov [word cs:old_09h],bx ;offset 09h

mov [word cs:old_09h+2],es ;segment 09h

mov ax,351Bh ;al=1Bh- номер вектора

int 21h

mov [word cs:old_1Bh],bx ;offset 1Bh

mov [word cs:old_1Bh+2],es ;segment 1Bh

;Установим новые обработчики векторов 09h и 1Bh функцией 25h. Адрес обработчиков должен

;быть в DS:DX



;Дальше, так же как в программе Prg3




;Собственно программа пользователя

;Бесконечный цикл вывода на экран "*", выход из которого возможен нажатием клавиши ESC.

;Нажатие комбинаций клавиш Ctrl-C и Ctrl-Break не прерывает цикл вывода "*" на консоль



;Дальше, так же как в программе Prg3



;Выход из цикла, т.к. нажата клавиша ESC

;Восстановление старых (системных) обработчиков

mov ax, 2509h ;al=09h -номер вектора

lds dx,[cs:old_09h] ;ds:dx - адрес вектора 09h

int 21h

mov ax, 251Bh ;al=1Bh -номер вектора

lds dx,[cs:old_1Bh] ;ds:dx - адрес вектора 1Bh

int 21h

;Выходим в DOS

Exit: mov ax,4C00h

int 21h

;Поля данных системных векторов

old_09h DD ?

old_1Bh DD ?
^

Endp main

End main


9. Резидентные программы и их организация

Резидентная программа, это программа, остающаяся в памяти после её завершения. Их ещё кратко называют ^ TSR – программами, что определяется английской фразой Terminate State Resident – завершить и остаться резидентным. Никогда не известно, по каким адресам в памяти оказываются загруженными в разное время TSR – программы, поэтому единственным способом получить управление над ними является механизм программных (пассивный резидент) или аппаратных (активный резидент) прерываний. Наиболее часто используются резидентные драйверы, обеспечивающие русифицированную работу экрана, клавиатуры или поддержку мыши. Общеупотребительны резидентные переводчики и детекторы, позволяющие на ранней стадии обнаружить появление вируса. MS-DOS рассматривает TSR – программы как часть операционной системы, защищая их адресное пространство от других систем.

TSR – программы обычно пишутся в формате .com, так как их проще оставить в памяти резидентными, в сравнении с exe-программами. Существует два стандартных способа оставить программу резидентной в памяти. Это прерывание Int 27h для COM – программ и функция DOS 31h, которая может использоваться как для Com –, так и exe- программ. Рассмотрим оба способа на примере шаблона типичной TSR – программы (правда, позже выяснится, что такая структура резидентной программы не вполне удовлетворят предъявляемым к ним требованиям).

%Title “Шаблон COM - резидента”

Ideal

Model tiny

Codeseg

Org 100h ;Установим IP на адрес после PSP

Proc resident

jmp init ;Переход на секцию инициализации

;Данные резидентной секции программы



Entry: ;Начало программного кода резидента (точка входа после активизации резидента)



Endp resident ;Секция инициализации резидента

Proc init



mov ah,27h ;Можно опустить

lea dx,[cs:init] ;DX - адрес первого байта за резидентной частью программы,

;CS – на начало PSP

Int 27h ;Оставить резидентной

Endp init

End resident ;Конец программы/точка входа

При запуске программы управление передаётся (в соответствии с параметром директивы ^ End) на начало процедуры resident. Командой jmp сразу же осуществляется переход на секцию инициализации, которая обычно оформляется в виде отдельной процедуры. В секции инициализации подготавливаются условия для работы программы (её вызова) в резидентном состоянии. В конце секции инициализации вызывается прерывание int 27h с параметрами, указанными в комментарии к шаблону. Секция инициализации располагается в конце программы и отбрасывается при её завершении. Прерывание 27h, закрепив за резидентной частью программы необходимую для её функционирования память, передаёт управление командному процессору DOS. Процесс первичного запуска резидентной программы, приводящего к её загрузке в память, называют её установкой. Наличие программы, резидентной в памяти, никак не отражается на ходе исполнения других программ, хотя уменьшает объём свободной памяти компьютера.

Шаблон резидентной программы (только секция инициализации) с использованием функции DOS 31h.

Proc resident



mov dx,(init-resident+10Fh/16) ;Размер резидентной части программы,

;включая PSP, в параграфах

mov ax,3100h ;Функция завершить и оставить в памяти

int 21h

Endp init

End resident

В данном случае в регистр DX записывается объём резидентной части программы с учётом PSP (+100h) и ещё добавляется число 0Fh, чтобы после целочисленного деления на 16, результат мог быть округлён в большую сторону.

Как уже отмечалось ранее, передать управление резиденту можно с помощью механизма аппаратных или программных прерываний. В этом случае, в процессе инициализации должен быть осуществлён перехват какого-либо системного прерывания или произведена установка одного из свободных векторов прерывания для пользователей, реализующих вход в резидентную часть на метку entry. Такой процесс активизации резидентной части программы обуславливает её оформление по типу обработчика прерывания, заканчивающегося командой iret, а метка entry – имя обработчика прерывания.

В резидентной программе Prg5_res, реализован принцип передачи управления (активизации) через посредство обработчика одного из свободных векторов прерывания для пользователей Int 61h. Для проверки работы резидента предлагается использовать тестовую программу Prg5_test. Особенности работы программ и их функциональное назначение разъяснено в подробных комментариях2 (естественно, тестовая программа запускается после успешной загрузки резидентной).

^ Prg5_res. Пассивный резидент с использованием прикладного программного обработчика прерывания с номером 61h

;Взаимодействие тестовой и резидентной задач выполняется через пользовательский вектор 61h.

;Тестовая программа передаёт управление резиденту командой int 61h, предварительно загрузив в

;регистр BP 16-разр.двоичное число для преобразования его в десятичное, а в регистры AX:BX-

;полный адрес (seg:offset) буфера результата преобразования. Резидент выполняет преобразование

;двоичного кода в десятичный (ASCII- формат) и помещает его в заданный буфер для тестовой

;программы.

Ideal

Model Tiny ;COM- программа

P386N

Codeseg

Org 100h ;Установим IP на адрес после PSP