Главная | Обратная связь | Поможем написать вашу работу!
МегаЛекции

Прямое обращение к памяти и портам ввода-вывода

Теоретическая часть

Операционная система управляет программами, периферийными устройствами, словом, всем. Важную роль здесь играют прерывания. Прерывание представляет собой сигнал процессору, вырабатываемый программой, каким-либо устройством или самим процессором. Этот сигнал приостанавливает выполнение программы и запускает соответствующую функцию операционной системы для выполнения необходимых системных действий. Необходимость прерываний вызвана двумя причинами – специальными запросами на выполнение системных действий, например по вводу и выводу данных, а также возникновением ошибок при выполнении программ. Прерываниям присваиваются номера, например $10. Прерывания от $1F включительно зарезервированы для BIOS, а начиная с $20 до $62 - для операций MS-DOS. Прерывания хранятся в специальной таблице прерываний. В таблице 1 приведен перечень некоторых прерываний.

Таблица 1.

Прерывание Владелец Назначение
$00 BIOS Прерывание из-за ошибки деления на нуль
$04 BIOS Прерывания из-за переполнения при умножении
$05 BIOS Функция печати копии экрана
$06 BIOS Исключительная ситуация «неопределенный код операции»
$07 BIOS Исключительная ситуация «код операции ESC»
$10 BIOS Обслуживание видеокарты
$11 BIOS Список установленного оборудования
$12 BIOS Размер памяти
$13 BIOS Обслуживание дискового ввода- вывода
$14 BIOS Обслуживание последовательного ввода вывода
$16 BIOS Обслуживание ввода- вывода с клавиатуры
$17 BIOS Обслуживание принтера
$19 BIOS Программа начальной загрузки системы
$1A BIOS Обслуживание системного таймера и часов
$1B BIOS Клавиши Control-Break
$1C BIOS Часы таймера пользователя
$21 MS-DOS Вызов функции MS-DOS
$22 MS-DOS Адрес завершения программы
$23 MS-DOS Адрес выхода Control-C
$24 MS-DOS Адрес аварийного завершения из-за фатальной ошибки
$25 MS-DOS Функция чтения по абсолютному адресу на диске
$26 MS-DOS Функция записи по абсолютному адресу на диске
$27 MS-DOS Функция «завершить и оставить резидентной»

 

В Паскале есть две процедуры для прямого обращения к функциям MS-DOS и BIOS -MSDos и Intr. Прерывания зависят от состояния регистров центрального процессора и заносят в эти регистры результат своей работы. Регистр – это внутреннее запоминающее устройство процессора для временного хранения обрабатываемой или управляющей информации. В модуле System имеется специальный тип Registers, который описывается следующим образом:

type

Registers = record

сase Integer of

0: (AX, BX, CX, BP, SI, DI, DS, ES, Flags: Word);

1: (AL, AH, BL, BH, CL, CH, DL, DH: Byte);

end;

 

тип Registers представляет собой запись, состоящую только из вариативной части. В табл. Дан список регистров процессора 80х86.

Таблица 2.

Регистры общего назначения
Регистры данных (16-битные = 8 + 8 бит)
Регистр Назначение
AX = AH AL Сумматор
BX = BH BL Базовый (индексный) регистр
CX = CH CL Счетный регистр
DX = DH DL Регистр данных
Индексные регистры и регистровые указатели (16 бит)
Регистр Назначение
SP Указатель стека
BP Указатель базы регистра
SI Регистр- индекс источника
DI Регистр- индекс назначения
Сегментные регистры (16 бит)
Регистр Назначение
CS Сегмент кода
DS Сегмент данных
SS Сегмент стека
ES Дополнительный сегмент
Регистр командного указателя (16 бит)
IP  
Флаговый регистр

Сегментом называется область памяти размером 64 Кбайт, которая начинается по любому адресу, кратному 16. В области памяти, выделяемой программе, имеется три основных сегмента:

1. Сегмент кода содержит машинные команды, которые будут выполняться. Первая выполняемая команда находится в начале кодового сегмента и операционная система для выполнения программы передает управление по адресу данного сегмента.

2. Сегмент данных содержит данные и рабочие области, необходимые программе.

3. Сегмент стека содержит адреса для возврата в операционную систему и для возврата из программ в главную программу.

Особенность регистров общего назначения заключается в том, что возможна их адресация как в целом (т.е. одним словом), так и каждой однобайтовой части (например, AL- младшая половина, а AH – старшая половина). Регистр AX является сумматором и применяется для всех операций ввода – вывода, некоторых арифметических и строковых операций. Регистр BX может использоваться для расширенной адресации и вычислений. Регистр CX необходим для управления числом повторений циклов и операций сдвига. Регистр DX применяется для некоторых операций ввода- вывода и тех арифметических операций над большими числами, которые используют два регистра DX:AX. Регистровые указатели SP и BP обеспечивают системе доступ к данным в сегменте стека, реже они используются для вычислений. Индексные регистры SI (индекс источника) и DI (индекс назначений) могут применяться для расширенной адресации и операций сложения и вычитания. Регистр командного указателя содержит смещение указателя на команду, которая должна быть выполнена.

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

Процедуры, предназначенные для работы с регистрами процессора и прерывания MSDos и Intr модуля DOS:

 

Procedure MSDos (var regs: Registers);

Procedure Intr (number: Byte; var regs: Registers);

 

Процедура Intr предназначена для обращения к прерыванию с указанным номером (первый параметр). Перед выполнением прерывания процедура загружает регистры процессора значением соответствующих полей записи regs. После выполнения прерывания содержимое этих регистров вновь записывается в соответствующую переменную. Процедура MSDos эквивалентна вызову процедуры Intr для прерывания $21.

Для прерывания $21 имеется несколько сотен функций MS-DOS, предназначенных для работы с файлами и дисками. Процедуры Паскаля, использующие все эти низкоуровневые операции, дают гораздо более удобные и безопасные способы их выполнения.

К работе с прерываниями следует прибегать, если в этом действительно есть необходимость. Это потенциально опасно, так как функции напрямую обращаются к операционной системе и выполняют системные операции. Неаккуратное обращение с ними может привести к потере части информации на дисках, и другим неприятным последствиям.

Практическая часть

1. Ввести программу.

2. Запустить на выполнение.

3. Пояснить работу процедур модуля DOS, предназначенных для выполнения системных операций (прерываний), обращения к памяти и портам ввода- вывода.

4. Ответить на контрольные вопросы

5. Оформить отчет

Задача 1 В качестве примера работы с прерываниями рассмотрим пример простой программы, в которой используется функция $2С для считывания показаний системных часов.

 

Program gettime;

 

Uses dos, crt;

 

Var

Regs: registers;

 

Begin

ClrScr;

regs.AH:= $2C;

intr ($21, regs);

write (‘Системные часы показывают ’);

with regs do

begin

write (CH, ‘ час. ’);

write (CL, ‘ мин. ’);

write (DH, ‘. ’);

If DL < 10 then

Write(0);

Writeln(DL, ‘ сек. ’);

End;

Writeln(‘нажмите <Enter>’);

Readln;

End.

 

 

Задача 2 Так, прерывание с номером 18 ($12) возвращает в регистре AX объем оперативной памяти ПЭВМ. Пример программы выводящей на экран сообщение об этом объеме:

Program IntrDem;

Uses DOS;

Var

r: registers;

Begin

Intr($12, r);

writeln('Объем памяти = ', r.АХ, ' Кбайт')

END.

 

 

Задача 3 Процедура MSDOS инициирует прерывание с номером 33 ($21);

обращения: MSDOS(< регистры >);

Здесь < регистры > - переменная типа REGISTERS, содержащая значения регистров на входе и выходе процедуры обработки прерывания.

Программное прерывание с номером 33 ($21) стоит особняком: как уже говорилось, оно дает доступ к большому количеству функций ДОС (этим прерыванием вызывается 85 функций). Рассматриваемая процедура полностью эквивалентна вызову процедуры INTR c номером прерывания 33. Программа примера выведет на экран версию операционной системы:

Program MsDosDemo;

Uses DOS;

Var

R: registers;

Begin

r.AH: = $30;

MsDos(r);

write1n ('Версия операционной системы: г.АL, '.', г.АН)

END.

 

 

Задача 4. С помощью следующих двух процедур программист может прочитать содержимое любого вектора или установить его новое значение.

Процедура GETINTVECT. Возвращает вектор прерывания с указанным номером; формат обращения GETINTVECT(< N >, < вектор >> Здесь < N > - выражение типа ВYТЕ, содержащее номер прерывания; < вектор > -переменная типа РOINTER, в которой возвращается адрес точки входа в процедуру обработки прерывания.

Пример: программа выводит на экран содержимое всех ненулевых векторов прерываний.

Uses DOS;

var

i: byte;

p: pointer;

Begin

for i:= 0 to 255 do

Begin

GetIntVec(i, p);

if (Seg(p^) <> 0) or (Ofs(p^) <> 0) then

write1n('N = ', i:3, 'Seg = ', Seg(p^):5, 'Ofs =', Ofs(p^):5);

End;

End.

 

Прямое обращение к памяти и портам ввода-вывода

В Турбо-Паскале имеется пять предварительно объявленных массивов: МЕМ, МЕМW, МЕМL, РОRТ и РОRТW. Первые три обеспечивают доступ к любому участку оперативной памяти по абсолютному адресу, два другие - доступ к портам ввода-вывода.
Компонентами массива МЕМ являются данные типа ВYТЕ, массива МЕМW - типа WORD, массива МЕМL - типа LONGINT. Обращение к элементам этих массивов, т.е. их индексация, имеет специальный вид: каждый индекс представляет собой абсолютный адрес и состоит из двух выражений типа WORD; первое дает сегментную часть адреса, второе - смещение; выражения разделяются двоеточием:

Mem[$0000:$1000]:= 0;

DataMem:= MemW[Seg(p):Ofs(p)];

MemLong:= MemL[64:i*SizeOf(rea1)];

Задача 5. Как следует из технического описания операционной системы МS DOS, в ПЗУ BIOS по адресу $F000:$FFFE зашит байт-идентификатор типа компьютера. Таким образом можно определить тип компьютера, на котором запускается программа:

Program DMA_Demo;

Begin

Write('Тип компьютера: ');

Case Mem[$FOOO:$FFFE] of

$FF: writeln('PC');

$FE: writeln('XT');

$FD: writeln('PCjr');

$FC: write1n('AT');

$F9: writeIn('совместимый c PC');

End

End.

Компонентами массива РОRТ являются байты, а массива РОRТW - слова. Индексами этих массивов должно быть выражение типа ВYТЕ, указывающее номер нужного порта. Присвоение значения элементу массива РОRТ или РОRТW приведет к записи в порт, упоминание элемента в выражении - к чтению из порта. Компоненты массивов РОRТ и РОRТW нельзя передавать в качестве параметров процедурам или функциям. Эти идентификаторы нельзя употреблять без индексных выражений.

Контрольные вопросы

1. Что представляют собой прерывания?

2. Какие номера прерываний зарезервированы за BIOS. MS-DOS?

3. Какие процедуры есть в Паскале для прямого обращения к функциям MS-DOS и BIOS?

4. Особенность регистров общего назначения

5. Процедуры, предназначенные для работы с регистрами процессора и прерывания MSDos и Intr модуля DOS

6. С помощью каких процедур можно прочитать любой вектор?

7. Охарактеризовать пять предварительно объявленных массивов: МЕМ, МЕМW, МЕМL, РОRТ и РОRТW.

Литература

1. Попов,И.И. Операционные системы, среды и оболочки: Учебное пособие[Тескт]/И.И.Попов, Т.Л.Партыка - М.:ФОРУМ: ИНФРА-М,2009 -400с

2. Олифер, В.Г. Сетевые операционные системы / В.Г. Олифер, А.А. Олифер – Спб.: Питер, 2006- 545с.

3. Спицына,О.И. Операционные системы и среды: лекционные материалы[Текст]/О.И.Спицына –Старый Оскол:ООО ТНТ, 2004-80с.

Поделиться:





Воспользуйтесь поиском по сайту:



©2015 - 2024 megalektsii.ru Все авторские права принадлежат авторам лекционных материалов. Обратная связь с нами...