
- •Вычислительные системы, сети и телекоммуникации: руководство к лабораторным и практическим занятиям
- •1. Арифметические команды
- •2. Логические команды
- •3. Сдвиговые команды
- •4. Команды передачи управления и управления флагами
- •5. Формат строк ассемблера. Метки и их использование
- •6. Директивы распределения памяти
- •7. Сегменты
- •8. Прерывания
- •9. Директивы порядка загрузки сегментов
- •10. Директивы управления программным счетчиком
- •11. Условия
- •12. Процедуры
- •13. Глобальные объявления
- •14. Макроопределения
- •15. Выражения
- •16. Директивы управления файлами
- •17. Резидентные программы
- •Библиографический список
- •Вычислительные системы, сети и телекоммуникации: руководство к лабораторным и практическим занятиям
- •400005, Волгоград, просп. Ленина, 28, корп.1
- •400005, Волгоград, ул. Советская, 35, корп.7
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 возвращается номер текущего видеорежима, в АН - число столбцов символов на экране, в ВН - номер активной страницы |