
Министерство образования Российской Федерации
Коломенский институт
Московского Государственного
Открытого Университета
Кафедра "Автоматика и электроника в машиностроении"
Курсовая работа по дисциплине ЭВМ и ВС
(Пояснительная записка)
Выполнил: студент группы И-43 Астахов А.В.
Принял: преподаватель Конышев А.Г.
Принял: преподаватель
г. Коломна, 2009 г.
Задание
Разработать РП на языке ассемблера персональных компьютеров типа IBM PC, работающих под управлением операционной системы MS-DOS в реальном режиме. РП должна загружаться в оперативную память и выгружаться из неё командой с соответствующими ключами. Операции загрузки, выгрузки должны сопровождаться выводом на экран поясняющих сообщений.
Задание по варианту
Ключ загрузки - /Z. Ключ выгрузки - /V. РП обслуживает прерывание от таймера (вектор 1Ch) . ОП в ответ на каждый 64-й запрос выводит на экран текущее время в виде <ч>:<мин>:<с>, например, 10:11:00.
Содержание
Задание…………………………………………………………..стр.2
Введение……………………………………………………… ..стр.4
Текст программы……………………………………………….стр.8
Вывод……………………………………………………………стр.13
Литература……………………………………………………....стр.15
Основная часть
Введение:
Большой класс программ, обеспечивающих функционирование вычислительной
системы (драйверы устройств, программы шифрации и защиты данных,
русификаторы, интерактивные справочники и др.), должны постоянно находиться в
памяти и быстро реагировать на запросы пользователя или на какие-то события,
происходящие в вычислительной системе. Такие программы носят названия
программ, резидентных в памяти (Terminate and Stay Resident, TSR), или просто
резидентных. Сделать резидентной можно любую программу, однако ввиду того,
что резидентная программа должна быть максимально компактной, чаще всего в
качестве резидентных используют программы типа.СОМ.
Чтобы сделать любую программу резидентной, достаточно ее закончить
прерыванием:
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),
ожидая ввода с клавиатуры.
Типичная структура резидентной программы:
text segment 'code'
assume CS:text, DS:text
org 100h
main proc
jmp init ;Переход на секцию инициализации
;Данные резидентной секции программы
. . .
entry: ;Текст резидентной секции программы
. . .
main endp
init proc ;Секция инициализации
mov DX, (init-main+10Fh)/16 ;Размер в параграфах
mov AH, 3100h ;Функция "Завершить и оставить в
int 21h ; памяти"
init endp
text ends
end main
Программа пишется в формате.СОМ, поэтому в ней предусматривается только
один сегмент, с которым связываются сегментные регистры CS и DS; в начале
сегмента резервируется 100h байт для PSP.
При запуске программы с клавиатуры управление передается (в соответствии
с параметром директивы end) на начало процедуры main. Командой jmp сразу же
осуществляется переход на секцию инициализации, которая может быть оформлена
в виде отдельной процедуры или входить в состав процедуры main. В секции
инициализации, в частности, подготавливаются условия для работы программы уже
в резидентном состоянии. Последними строками секции инициализации вызывается
функция DOS 31h, которая выполняет завершение программы с оставлением в
памяти указанной ее части. Размер резидентной части программы (в параграфах)
передается DOS в регистре DX. Определить размер резидентной секции можно,
например, следующим образом. К разности смещений init-main, которая равна
длине резидентной части программы в байтах, прибавляется размер PSP (100h) и
еще число 15 (0Fh) для того, чтобы после целочисленного деления на 16
результат был округлен в большую сторону.
С целью экономии памяти секция инициализации располагается в конце
программы и отбрасывается при ее завершении.
Функция 31h, закрепив за резидентной программой необходимую для ее
функционирования память, передает управление командному процессору и
вычислительная система переходит в исходное состояние. Наличие программы,
резидентной в памяти, никак не отражается на ходе вычислительного процесса,
за исключением того, что уменьшается объем свободной памяти. Одновременно в
память может быть загружено любое число резидентных программ.