- •Методические указания к выполнению работы Внутренняя организация мп семейства 80х86 в реальном режиме работы
- •Внутренние регистры мп
- •Организация памяти
- •Система прерываний мп
- •Аппаратные прерывания в ibm pc
- •Выполнение работы
- •0: (Ax,bx,cx,dx,bp,si,di,ds,es,Flags: Word); {16-ти разр. Регистры}
- •1: (Al,ah,bl,bh,cl,ch,dl,dh); {8-ми разр. Регистры}
- •Контрольные вопросы
- •Методические указания к выполнению работы
- •Контрольные вопросы
- •Лабораторная работа № 3 Средства ос Windows для управления процессами и потоками
- •Подготовка к работе
- •Программа работы
- •Методические указания к выполнению работы Управление процессами и потоками в ос Windows
- •Выполнение работы
- •Контрольные вопросы
- •Методические указания
- •0: XPos: SmalInt; {либо как координаты X и y}
- •1: Pos: tSmallPoint; {или как одна точка]
- •Контрольные вопросы
- •Методические указания к выполнению работы Получение информации о логических дисках, томах и файлах
- •Выполнение работы
- •Контрольные вопросы
- •Библиографический список
Аппаратные прерывания в ibm pc
Для управления аппаратными прерываниями в IBM PC используются два ПКП типа К580ВН59А. К каждому из ПКП можно подключить до 8 устройств и, таким образом, в системе можно использовать до 16 аппаратных прерываний (
Максимальный приоритет имеет прерывание IRQ0 (системный таймер). Прерывания IRQ0 – IRQ7 соответствуют векторам прерываний - 8H -0FH, а IRQ8 - IRQ15 – 70H - 77H.). Одна часть аппаратных прерываний IBM PC жестко закреплена за стандартными устройствами (таймер, клавиатура и т.д.), другая - зарезервирована и может использоваться системой для дополнительных устройств (звуковая карта и т.д.).
Максимальный приоритет имеет прерывание IRQ0 (системный таймер). Прерывания IRQ0 – IRQ7 соответствуют векторам прерываний - 8H -0FH, а IRQ8 - IRQ15 – 70H - 77H.
табл. 6
Номер прерывания (IRQ) |
Устройство |
0 |
таймер |
1 |
клавиатура |
2 |
ПКП |
3 |
COM1 |
4 |
COM2 |
5 |
фиксированный диск |
6 |
контроллер гибких дисков |
7 |
LPT1 |
8 |
CMOS и часы реального времени |
9 |
- |
10-12 |
резерв |
13 |
математический сопроцессор |
14 |
контроллер фиксированных дисков |
15 |
резерв |
В адресном пространстве ввода-вывода МП ПКП занимают два адреса: 20Н и 21Н.
Выполнение работы
К п. 1. Текст основной программы на языке Turbo Pascal может выглядеть следующим образом:
Begin
{сохранение старых и установка новых векторов прерываний в п.3,4}
Repeat
Repeat
Until Keypressed; {ожидание нажатия клавиши}
Ch:=ReadKey; {чтение кода нажатой клавиши}
Case Ch of
...{обработка нажатия клавиши }
End; {Case}
Until Ch=’E’; {выход из программы при нажатии клавиши ‘E’}
{восстановление ‘старых’ векторов прерываний в п.3,4}
End.
В приведенной программе используются функции стандартного модуля Crt.
К п. 2. Turbo Pascal предусматривает возможность использования стандартных функций ОС MS DOS. Единственным механизмом обращения к функциям DOS является вызов программного прерывания. При возникновении программного прерывания, в большинстве случаев необходимо передать процедуре обработки прерывания некоторые параметры, в которых конкретизируется запрос нужной функции. Эти параметры, а также выходная информация (результат обработки прерывания) передаются из программы в процедуру и обратно через регистры ЦП. В составе модуля Dos Турбо-Паскаля для этих целей определен специальный тип данных:
Type
Registers=record
Case integer of
0: (Ax,bx,cx,dx,bp,si,di,ds,es,Flags: Word); {16-ти разр. Регистры}
1: (Al,ah,bl,bh,cl,ch,dl,dh); {8-ми разр. Регистры}
End; {Case}
End;
Этот тип имитирует регистры ЦП и дает возможность обращаться к ним как к 16-ти и 8-ми разрядным регистрам.
Для обращения к функциям DOS в Турбо-Паскале используются следующие процедуры:
процедура Intr -вызывает программное прерывание с заданным номером:
Intr( <№ прерывания: Byte>,<регистры: Registers>);
процедура MSDOS -инициирует прерывание с номером 33 ($21):
MSDOS(<регистры: Registers>).
Программное прерывание $21 дает доступ к большому количеству функций DOS (85 функций). Процедура MSDOS эквивалентна вызову Intr с номером $21.
Пример программы:
Uses dos;
Var r: Registers;
Begin
r.AH:=$30; {в AH заносится номер функции прерывания $21}
MSDOS(r); {вызов программного прерывания $21} или {Intr($21,r)}
Writeln (‘версия DOS:’, r.AL,’.’,r.AH);
End.
К п.3. Для использования собственных подпрограмм обработки прерываний необходимо выполнить следующие действия:
разработать подпрограмму обслуживания прерывания;
в начале работы программы сохранить старый вектор прерывания в переменной типа Pointer;
задать новый вектор прерывания, указывающий на разработанную подпрограмму;
вызывать программное прерывание нужно в соответствии с правилами, описанными в п.2 лабораторной работы;
при завершении работы программы восстановить “старый” вектор прерывания.
Турбо-Паскаль предоставляет возможность разработки процедур обработки прерывания на языке высокого уровня. Процедура обработки прерывания должна содержать служебную директиву Interrupt (прерывание), например:
Procedure ProcInt (Flags,CS,IP,AX,BX,CX,DX,SI,DI,DS,ES,BP:Word); Interrupt;
Begin
{действия по обработке прерывания}
End;
Директива Interrupt обеспечивает автоматическое сохранение содержимого регистров ЦП в стеке при вызове процедуры обработки прерывания и извлечение их из стека перед выходом из процедуры. Это необходимо для того, чтобы процедура обработки прерывания не искажала работу прерванной программы.
Формальные параметры в заголовке процедуры должны перечисляться в указанном порядке. Количество перечисляемых параметров - не должно превышать 12. Если в списке пропущен какой-либо параметр, то должны быть пропущены и все предшествующие ему параметры.
Для связи с процедурами прерываний используются векторы прерываний. Следующие процедуры модуля Dos позволяют прочитать содержимое вектора или установить его новое значение.
Процедура GetIntVec - возвращает вектор прерывания с указанным номером:
GetIntVec (<№ прерывания: Byte>,<вектор прерывания: Pointer>);
Процедура SetIntVec - устанавливает новое значение вектора прерывания:
SetIntVec (<№ прерывания: Byte>,<адрес входа в процедуру: Pointer>;
Для получения адреса входа в процедуру обработки прерывания необходимо использовать функцию Addr, например:
SetIntVec($61,Addr(ProcInt));
К п.4. Часто в программах для отсчета временных интервалов удобно использовать системный таймер, прерывание от которого формируется 18,2 раза в секунду. Перекрытие стандартного прерывания от таймера нецелесообразно, т.к. таймер в системе играет важную роль.
Для добавления своего кода к прерыванию от таймера удобно использовать пустое специальное прерывание BIOS $1C, которое вызывается прерыванием от таймера и ничего не делает, пока вы не напишете для него свой код. Вы должны изменить вектор прерывания $1C так, чтобы он указывал на процедуру в вашей программе. При завершении работы программы, вы должны восстановить исходное значение вектора (см. п.3.).
Любая процедура обработки прерывания (и особенно от таймера) должна выполняться быстро и не содержать длительных операций ввода-вывода. Поэтому основное назначение разработанного дополнения к прерыванию должно заключаться в подсчете и/или контроле числа обработанных прерываний от таймера. Прерывание от таймера обрабатывается каждые 0,055с. Таким образом, интервал времени в 1с, можно получить, обработав 18 прерываний от таймера. Например, используя глобальную переменную и изменяя ее значение при обработке прерывания (число обработанных прерываний от таймера), можно контролировать ее текущее значение в основной программе и там же выполнять необходимые действия (менять цвет фона, символов и т.д.).
К п.5. Значения векторов прерывания хранятся в оперативной памяти компьютера, т.е. представляют собой последовательность байтов. В языке Pascal для прямого доступа к любому участку оперативной памяти предварительно объявлены массивы Mem, MemW и MemL. Компоненты массива Mem – значения типа Byte; массива MemW – типа Word; массива MemL – типа Longint. Для обращения к элементам этих массивов необходимо указать индекс, который представляет собой абсолютный адрес ячейки памяти. Абсолютный адрес состоит из двух выражений типа Word; первое дает адрес начала сегмента, а второе задает смещение внутри этого сегмента. Эти выражения разделяются двоеточием. Например:
S:= Mem [$0000:$FFFF];
MemW [$4000:$0001]:=3578;
Начальные адреса процедур можно получить, как отмечалось выше, с помощью функции Addr, которая возвращает значение типа Pointer. Но тип Pointer нельзя распечатать с помощью стандартных процедур. Для преобразования типа Pointer используют функции Seg(X) и Ofs(X), которые возвращают значения типа Word соответственно для начального адреса сегмента и смещения в сегменте для объекта Х (переменной, процедуры или функции).