Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Скачиваний:
31
Добавлен:
20.06.2014
Размер:
262.14 Кб
Скачать

Министерство образования и науки Российской федерации

Московский государственный открытый университет

Коломенский институт (Филиал)

В.И.РОМАНОВ

ВЫЧИСЛИТЕЛЬНЫЕ МАШИНЫ, СИСТЕМЫ И СЕТИ

Методические указания к курсовой работе

г. Коломна

1998 г.

Романов В.И.

Методические указания

к курсовой работе по курсу

"Вычислительные машины,

системы и сети".

Коломенский институт (Филиал)

Московского государственного

открытого университета в г. Коломна

1998-23с. Библ.3.

Методические указания предназначены для студентов специальности

2101 "Управление и информатика в технических системах" и используются

при выполнении курсовой работы по курсу " Вычислительные машины,

системы и сети ". Работы выполняются на персональных

компьютерах IBM PC AT.

Утверждено на заседании кафедры

Aвтоматики и электроники в

машиностроении Коломенского

института (филиала) МГОУ.

СОДЕРЖАНИЕ

Стр.

ВВЕДЕНИЕ.........................................................3

РЕЗИДЕНТНЫЕ ПРОГРАММЫ ...........................................4

1. Установка резидентной программы ............................4

2. Резидентный обработчик прерываний от клавиатуры

с подключением до системного обработчика ...................6

3. Резидентный обработчик прерываний от клавиатуры

с подключением после системного обработчика ................8

4. Резидентная программа с защитой от повторной установки ....10

5. Выгрузка РП с помощью ее вызова из специальной программы ..12

6. Общая программа загрузки и выгрузки РП ....................14

7. Обработка опций ...........................................15

8. Создание диалоговой среды .................................16

9. Загрузка РП в верхнюю память ..............................17

10.Действия, выполняемые РП ..................................18

ЗАДАНИЕ НА КУРСОВУЮ РАБОТУ .....................................22

Литература .....................................................23

РАЗМЕЩЕНИЕ ПРИМЕРОВ

Стр.

1. Рп с вызовом через вектор прерывания Int 60h.................4

2. РП с вызовом по клавише 'Обр. апостроф'......................6

3. РП с вызовом по комбинации клавиш Ctrl+Z.....................9

4. РП с защитой от повторной установки.........................10

5. РП с возможностью ее выгрузки отдельной программой..........12

6. РП с возможностью ее самовыгрузки...........................15

7. РП с возможностью ее самовыгрузки по опциям.................16

8. РП с загрузкой и выгрузкой в диалоговом режиме..............17

9. Вывод текущей даты в последние позиции экрана..............18

10. Вывод содержимого регистров отлаживаемой программы.........19

ВВЕДЕНИЕ

Курсовая работа предназначена для студентов 4 курса дневного

отделения специальности 2101 "Управление и информатика в технических

системах". Курсовая работа выдается после изучения студентами основных

устройств компьютера IBM PC: системы управления клавиатурой, таймером,

подсистемы оперативной памяти и CMOS, контроллера прерываний и работой

видеосистем.

К моменту выдачи курсовой работы студенты должны иметь навыки

составления и трансляции несложных EXE и COM программ на языке

ассемблера. Должны быть знакомы с отладкой таких программ с помощью

утилиты DEBUG или в среде TURBO DEBUG.

Выполняя курсовую работу, студенты более глубоко знакомятся с

с организацией системы аппаратных и программных прерываний,

расположением в памяти массива векторов прерываний, взаимодействием

прерываний DOS и BIOS, условиями и возможностью перехвата и

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

завершения таких прерываний. Кроме того, хорошо уясняются назначение

и порядок вызова резидентных программ и их взаимодействие с обычными

нерезидентными программами. Изучаются способы загрузки в память и

выгрузки из памяти TSR-программ и способы защиты таких программ от

повторной установки.

Резидентные программы

Большой класс программ, обеспечивающих функционирование

вычислительной системы (драйверы, русификаторы, словари и др.) должны

постоянно находится в памяти и мгновенно реагировать на запросы

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

TSR-программ (Terminate and Stay Resident). Сделать резидентной можно

как COM-программу, так и EXE-программу, но из-за компактности обычно это

COM-программы.

1. Установка резидентной программы

Чтобы сделать любую программу резидентной, достаточно ее закончить

прерыванием:

Int 21,31 - завершить и остаться резидентной;

AL - код возврата (errorlevel);

DX - размер резидентной части программы в параграфах.

Однако, сразу встает вопрос - а как же ее запустить повторно?

Возможны разные способы но наиболее употребительны следующие:

1. С помощью программных прерываний. То есть запускается обычная

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

которого есть точка входа в резидентную программу. Для этого в DOS

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

Int 60h...Int 66h с пустыми адресами прерывающих программ 0000:0000.

Изменить эти адреса можно с помощью прерывания:

Int 21,25 - установить новый адрес вектора прерывания

AL - номер изменяемого прерывания

DS:DX - новый адрес прерывающей программы

2. С помощью свободных аппаратных прерываний. То есть таких, где всю

обработку, вместо стандартного обработчика аппаратного прерывания,

делает наша резидентная программа.

Изменить адрес обработчика аппаратного прерывания можно с

помощью все того же прерывания Int 21,25.

Например с помощью прерывания от таймера пользователя с вектором

1C (возникает 18,2 раз в сек) можно запускать программу для вывода

показаний часов.

3. C помощью прерывания от клавиатуры IRQ1 с вектором 09. В этом случае резидентная программа запускается по заданной клавише.

ЗАМЕЧАНИЕ: Внутри резидентных программ, вызываемых аппаратным

прерыванием, не должно быть прерываний Int21h, так как резидентная

программа запускается в случайные моменты времени, когда основная

программа может выполнять свое Int21h. Тогда оно войдет само в себя,

что недопустимо, так как они используют общий стек. С меньшей степенью

вероятности это относится и к другим прерываниям. Даже когда ПК стоит,

COMMAND.COM на самом деле выполняет прерывание INT 21h (функция 0Ah),

ожидая ввода с клавиатуры.

Пример 1

Создадим резидентную программу с вызовом через вектор прерывания

Int 60h. При вызове программа выводит цветной символ в последнюю

позицию экрана и меняет цвет символа при каждом новом вызове.

Seg1 SEGMENT

ASSUME SS:Seg1,DS:Seg1,CS:Seg1,ES:Seg1

ORG 100h ;Начало программы с 0100h

Pr: JMP M1 ;Пропускаем резидентную часть

;--------------------- Резидентная часть

sym1 dw 421Eh ;1-й выводимый символ

sym2 dw 241Eh ;2-й выводимый символ

;---------------------

M2: push AX ;Сохраним те регистры, содержимое

push ES ;которых меняется в программе

mov AX,0B800h ;В рег.ES засылаем cегментный

mov ES,AX ;адрес буфера экрана B800

mov AX,CS:sym1 ;¬

xchg AX,CS:sym2 ;¦Oбмен местами sym1 - sym2

mov CS:sym1,AX ;-

mov ES:3998,AX ;Вывод в посл.поз.экрана 3998

pop ES ;Восстановим содержимое

pop AX ;регистров ES и AX

IRET ;Выход в DOS

M1: ;---------------------- Инициирующая часть

mov AX,2560h ;Установка нового адреса <адр.M2>

lea DX,M2 ;обработчика прерывания int 60h

INT 21h ; -------

mov AH,09h ;Вывод строки:

lea DX,x ;'Резидентный обработчик загружен$'

INT 21h ; -------

mov AX,3100h ;Завершить и оставить pезидентной

mov DX,(M1-Pr+10Fh)/16 ; часть размером (M1-Pr+10Fh)/16

INT 21h ; -------

x db 'Резидентный обработчик загружен$'

Seg1 ENDS ;Конец сегмента

END Pr ;Полный конец программы Primer

К размеру резидентной части (M1-Pr) прибавляется размер PSP

(100h) и еще 15, чтобы при делении на 16 округлить результат в

большую сторону. Это будет размер в параграфах.

Почему 'mov AX,CS:sym1', а не просто 'mov AX,sym1'? Это вызвано

тем, что все адреса в рег. ES,DS,SS принадлежат той программе, из

которой была вызвана прерывающая программа. Только CS меняется, как

при обычном дальнем вызове. При возврате CS восстанавливается из

стека.

Обратите внимание, что резидентная часть заканчивается командой

IRET, так как вызывается она прерыванием, а не командой CALL.

Отличается IRET от RET тем, что из стека читается кроме CS:IP еще и

содержимое регистра признаков.

Для того, чтобы вызвать эту резидентную программу и заставить

ее вывести символ на экран, нужна обычная программа, в которой есть

программное прерывание Int 60h:

Seg1 SEGMENT

ASSUME CS:Seg1

ORG 100h ;Начало программы с 0100h

V: int 60h ;Команда вызова резидентной программы

mov AX,4C00h ;Выход в DOS

int 21h

Seg1 ENDS ;Конец сегмента

END V ;Полный конец программы

Такую же резидентную программу можно сделать с вызовом по прерыванию

от таймера пользователя (возникает 18,2 раз в сек) с вектором 1Ch.

Это дублер прерывания системного таймера IRQ0.

Программа будет отличаться только тем, что в инициирующей части

номер прерывания Int 60h cледует заменить прерыванием Int 1Ch:

M1: ;---------------------- ;Инициирующая часть

mov AX,251Ch ;Установка нового адреса <адр.M2>

lea DX,M2 ;обработчика прерывания int 1Ch

INT 21h ; -------

Соседние файлы в папке Кр и методичка Разработка резидентной программы в MS DOS