Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
ВС сети и телекомм-практикум.doc
Скачиваний:
45
Добавлен:
01.07.2025
Размер:
613.89 Кб
Скачать

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

Программы, остающиеся в памяти, во время того после того как операционная система выполняет свои обычные функции: исполняет команды, запускает другие ( фоновые ) программы и т.п., называются резидентными. Резидентными являются многие системные программы.

Чтобы программа была резидентной, нужно, чтобы операционная система считала занятой ту область памяти, в которой размещается эта программа, и не отдавала эту память для других целей. При этом единственным способом для резидентной программы проявить каким-то образом себя на фоне обычной работы операционной системы является реакция на аппаратные или программные прерывания. Таким образом, резидентная программа - это всегда программа обработки прерываний.

Никогда не известно, по каким адресам в памяти оказываются загруженные в разное время резидентные программы, поэтому единственным несложным способом получения управления является механизм программных и аппаратных прерываний. Принято разделять резидентные программы на активные и пассивные, в зависимости от того, перехватывают ли они прерывания от внешних устройств или получают управление, только если программа специально вызовет команду INT с нужным номером прерывания и параметрами.

Резидентная программа состоит, как правило, из нерезидентной и резидентной частей. Задача нерезидентной части - выполнить действия по начальной установке ( загрузке) TSR-программы. Главное здесь - запоминание прежних значений перехватываемых векторов прерываний и установка новых значений, т.е. перехват прерываний. Кроме того, здесь может выполняться инициализация переменных, используемых затем при резидентной работе, чтение адреса флага DOS, выделение динамической памяти и другие начальные действия.

Резидентная часть программы представляет собой одну или несколько процедур обработки перехваченных прерываний. Желательно, чтобы при любых условиях такая процедура вызывала также и прежнюю подпрограмму, на которую указывал вектор до перехвата. Даже если программе не нужна стандартная обработка прерываний, может случиться, что вектор был ранее перехвачен другими TSR-программами, тогда по одному прерыванию могут успешно вызываться несколько программ.

Превратить программу в резидентную просто – достаточно вызвать функцию 31h прерывания INT 21h. Данная функция имеет следующую структуру:

Ввод:

АН = 31h

AL = код возврата

DX = размер резидента в 16-байтных параграфах (больше 06h), считая от начала PSP

ЗАДАНИЕ 1

Используя эмулятор ассемблера, наберите и запустите указанные ниже участки программного кода.

Для начала изучим работу простейших арифметических команд

Программа 1:

MOV BX, 5

MOV CL, 2

MOV AX, 4

ADD BX, CL

SUB BX, 3

IMUL BX

MOV AX, 10

IDIV BX

Полученные результаты этой и последующих программ заносим в таблицу вида 1:

Таблица 1

Кодировка

Регистры общего назначения

Регистр флагов

Порт ввода 300h/

(вывода 301h)

AX

BX

CX

DX

AH

AL

BH

BL

CH

CL

DH

DL

Далее переходим к более сложным командам двоичной арифметики, а также командам сравнения

Программа 2:

MOV BX, 9

MOV CL, 2

MOV AX, 4

INC CL

DEC BX

ADC BX, CL

CMC

SBB BX, AX

NEG AX

CMP CL, BX

TEST AX, BX

Далее рассмотрим работу сдвиговых команд.

Программа 3:

MOV DX, 300H

IN AX, DX

SHL AX, 2

MOV DX, 301h

OUT DX, AX

MOV BX, AX

MOV CL, 1

SHL AX, CL

ADD AX, BX

OUT DX, AX

Заменяем в программе строки логического сдвига

SHL AX, 2

SHL AX, CL

Последовательно на следующие варианты

а) команды арифметического сдвига

SAL AX, 3

SAR AX, CL

б) команды циклического сдвига

ROL AX, 6

ROL AX, CL

Результаты также заносим в таблицы типа 1.

В следующей программе продемонстрируем работу безусловного и условных переходов, а также переход по счетчику.

Программа 4

MOV DX, 300h

IN AX, DX

MOV BX, 2

M1:

DEC BL

JS M2

JMP M1

M2:

MOV CX, 3

CIKL:

ADD AX, 2

LOOP CIKL

JNP M3

INC AX

M3:

MOV DX, 301h

OUT DX, AX

Переходим к логическим командам

Программа 5:

MOV DX, 300h

IN AX, DX

NOT AX

MOV DX, 301h

OUT DX, AX

Полученные результаты программы заносим в первую строку таблицы 2.

Таблица 2

Первое введенное число

Второе введенное число

Логическая операция

Полученный результат

Примечание. Числа и результат записываем в двоичном виде. Поле «второе введенное число» в первой строке таблицы два будет пустым, так как команда NOT имеет лишь один операнд. Остальные строки будут заполнены целиком.

Программа 6:

MOV DX, 300h

IN AX, DX

MOV BX, AX

IN AX, DX

AND AX, BX

MOV DX, 301h

OUT DX, AX

Поскольку участки программного кода, показывающие работу команд OR (ИЛИ) и XOR (исключающее ИЛИ), практически идентичны участку, приведенному для команды AND (И), поступим следующим образом. Заменим строку

AND AX, BX

сначала на

OR AX, BX

а потом на

XOR AX, BX.

Остальные строки остаются неизменными.

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

В последней программе Задания 1 продемонстрируем работу команд, управляющих состоянием флагов.

Программа 7:

STI

STC

STD

CLI

CLD

CLC

CMC

Полученные результаты заносим в таблицу 3.

Таблица 3

Команда

Состояние флагов

Примечание. В первой строке не заполняем поле «команда», а в поле «состояние флагов» пишем те, которые уже установлены.

Дальнейшие задания необходимо выполнять не на эмуляторе, а на полноценном ассемблере. Никаких таблиц заполнять не требуется, для отчета требуется предоставить код написанных программ.

ЗАДАНИЕ 2

Написать на ассемблере программу, показывающую системную дату и время и, в зависимости от него, выдающую сообщения «Доброе утро», «Добрый день» и «Добрый вечер».

В качестве дополнительного материала для написания этой и последующих программ нам понадобятся данные функциях прерывания INT 21h.

Таблица 4. Функции прерывания INT 21h

AH

Действие функции

01h

Выполняет ввод командного символа с клавиатуры. Код помещается в регистр AL. Введенный символ отображается на экране, помимо своей командной функции (эхо-отображение).

02h

Отображение на стандартном выводе символа, находящегося в регистре DL

07h

Работает аналогично 08h

08h

Работает аналогично 01h, за исключением отсутствия эхо

09h

Осуществляет вывод строки символов на экран. Смещение строки содержится в регистре DX, а сегментный адрес, соответственно, в DS.

Продолжение таблицы 4.

AH

Действие функции

0Ah

Выполняет буферизованный ввод строки с клавиатуры. При этом символы вводятся один за другим, как при многократном применении функции 01h, до тех пор, пока не будет введен код 0dh ( ASCII код клавиши "Enter" ), завершающий строку. Допустимо редактирование в процессе ввода

0Bh

Идет проверка на наличие символов в буфере. Если есть, то устанавливается AL=0ffh, если нет, то AL=00h

0Ch

Очистка буфера клавиатуры, а затем выполнение одной из функций: 01h, 07h, 08h или 0Аh. Номер функции заносится в регистр AL. Если задано иное число, то выполняется только очистка буфера.

2Ch

Вызывает системное время и записывает его в следующие регистры:

СH – часы;

CL – минуты;

DH – секунды;

DL – доли секунды

3Fh

Считывание данных из файла или устройства, являющегося связанным с описателем стандартного ввода (указан в ВХ). В СХ находится количество байт, которое необходимо считать. Смещение буфера содержится в DX, а сегментный адрес, соответственно, в DS

40h

Запись данных в файл или устройство, связанное с описателем стандартного вывода (указан в ВХ). В СХ находится количество записываемых байт. Смещение этих данных содержится в DX, а сегментный адрес, соответственно, в DS

4Ch

Завершение программы и передача управления обратно в операционную систему

ЗАДАНИЕ 3

Написать на ассемблере программу, способную реверсировать введенную пользователем строку символов.

ЗАДАНИЕ 4

Написать на ассемблере резидентную программу, выводящую на экран сообщение каждые пять секунд.

Обратить внимание на то, чтобы во время смены минут и часов не происходило программных сбоев!

ЗАДАНИЕ 5

Написать на ассемблере программу, рисующую на экране закрашенный треугольник и перемещающую его при помощи заданных командных клавиш.

В качестве дополнительного материала для написания программы нам понадобятся данные о кодах таблицы ASCII и о функциях прерывания INT 10h.

В таблице 5 представлены все необходимые данные по таблице символов ASCII.

Таблица 5. Коды ASCII

Младшая часть кода

Старшая часть кода

0

1

2

3

4

5

6

7

0

-

-

!

0

@

P

`

p

1

-

-

"

1

A

Q

a

q

2

-

-

#

2

B

R

b

r

3

-

-

$

3

C

S

c

s

4

-

-

%

4

D

T

d

t

5

-

-

&

5

E

U

e

u

6

-

-

'

6

F

V

f

v

7

-

-

(

7

G

W

g

w

8

-

-

)

8

H

X

h

x

9

-

-

*

9

I

Y

i

y

Продолжение таблицы 5.

Младшая часть кода

Старшая часть кода

0

1

2

3

4

5

6

7

A

-

-

+

:

J

Z

j

z

B

-

ESC

,

;

K

[

k

C

-

-

-

<

L

\

l

|

D

-

-

.

=

M

]

m

E

-

-

/

>

N

^

n

~

F

-

-

!

?

O

_

o

DEL

В таблице 6 показаны функции прерывания INT 10h - прерывания BIOS, позволяющего программисту эффективно работать с графикой.

Таблица 6. Функции прерывания INT 10h

AH

Действие функции

00h

Установить режим видео. В AL помещаем код необходимого нам режима. При повторном вызове данная функция используется для очистки экрана.

01h

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

02h

Установить курсор в заданное место на экране. Номер строки задается в регистре DH, а номер столбца – в DL. В случае необходимости задания номера видеостраницы, помещаем его в регистр BH.

03h

Считываем текущую позицию курсора, ориентируясь на данные регистров после задания функции 02h. При этом в CH и CL заносятся верхняя и нижняя строки развертки курсора.

05h

Переключение активной страницы на экране, причем ее номер содержится в AL.

Продолжение таблицы 6.

AH

Действие функции

06h

Скроллинг (прокрутка) вверх активной страницы. При этом в регистрах CH и CL необходимо указать координаты верхнего левого угла экранной области, а в DH и DL - координаты нижнего правого угла. Помимо этого, в AL помещаем число строк для скроллинга; а в BH - атрибуты для заполнения освободившихся строк (если это необходимо).

07h

Скроллинг вниз. Работает аналогично функции 06h.

08h

Прочитать символ, на позиции которого находится курсор. AL содержит его код, а АН –атрибуты, задающие цвета символа и фона.

Общий объем, выделенный под атрибуты, как сказано выше, 1 байт (8 битов). Биты предназначены для следующего (начинаем с нулевого бита):

0-2 – цвет символа;

3 – уровень яркости;

4-6 – цвет фона

7 – эффект мигающего символа.

09h

Вывод на экран символа с заданными атрибутами. В BH указывается активная страница; в AL ASCII код символа; в BL его атрибуты, а в CX число повторений символа.

0Ah

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

0Bh

Устанавливает цветовую палитру

0Ch

Запись точки

0Dh

Чтение точки

0Eh

Выводит символ из AL в текущую позицию. При этом курсор смещается на одну позицию.

0Fh

Прочитать текущее состояние видео. В AL возвращается номер текущего видеорежима, в АН - число столбцов символов на экране, в ВН - номер ак­тивной страницы

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]