34661

Доступ к системным ресурсам. Определение переменной как Absolute. Предопределенные массивы MEM. Прерывания. Обработка прерываний

Реферат

Информатика, кибернетика и программирование

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

Русский

2013-09-08

66 KB

7 чел.

исциплина «Основы алгоритмизации и программирование»  Доступ к системным ресурсам

Доступ к системным ресурсам. Определение переменной как Absolute. Предопределенные массивы MEM. Прерывания. Обработка прерываний.

Доступ к системным ресурсам.

В операционной  системе  MS-DOS  доступ к системным функциям осуществляется посредством программных прерываний.  Каждое прерывание позволяет сделать обращение к функциям определенной категории. Тип функции определяется значением регистра АН. Дополнительная  информация  при  необходимости передается через регистры AL, BX,  CX и DX.

Определение переменной как Absolute.

Var идентификатор : тип Absolute сегмент:смещение;

или

Var идентификатор : тип Absolute переменная;

Замечания:

1. Первая форма непосредственно задает адрес (сегмент и смещение) переменной. Оба значения должны быть внутри диапазона $0000..$FFFF (от 0 до 65,535).

2. Вторая форма объявления размещает новую переменную поверх существующей переменной (по тому же самому адресу).

3. Если в списке переменных присутствует слово Absolute, то в данной строке может находиться только одна переменная.

Предостережение:

- Используйте первую форму объявления осторожно. Во время работы Windows в защищенном режиме ваше приложение не может иметь прав доступа к областям памяти вне вашей программы. При попытке обращения к этим областям, выполнение вашей программы, вероятно, будет приостановлено.

- Вторая форма объявления абсолютных переменных безопасна для приложений Windows. Память, к которой вы обращаетесь, находится внутри области памяти вашей программы.

Пример:

Type VectorTable = Array [0..255] Of Pointer;

Var IntVectors : VectorTable Absolute 0:0;

CrtMode : Byte Absolute $0040:$0049;

Str : String;

StrLen : Byte Absolute Str;

Предопределенные массивы MEM

В Турбо Паскале имеются предварительно объявленные массивы: MEM, MEMW, MEML, PORT и PORTW. Первые три обеспечивают доступ к любому участку оперативной памяти по абсолютному адресу, два других - доступ к портам ввода-вывода.

Компонентами массива MEM являются данные типа BYTE, массива MEMW - типа WORD, массива MEML - типа LONGINT. Обращение к элементам этих массивов, т.е. их индексация, имеет специальный вид: каждый индекс представляет собой абсолютный адрес и состоит из двух выражений типа WORD; первое дает сегментную часть адреса, второе - смещение; выражения разделяются двоеточием. Например:

Меm[$0000:$1000] := 0; 

DataMem := MemWfSeg(p):0fs(p)]; 

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

Компонентами массива PORT являются байты (тип BYTE), а массива PORTW - слова (тип WORD). Индексами этих массивов должно быть выражение типа BYTE, указывающее номер нужного порта. Присвоение значения элементу массива PORT или PORTW приведет к записи в порт, упоминание элемента в выражении - к чтению из порта. Компоненты массивов PORT и PORTW нельзя передавать в качестве параметров процедурам или функциям. Эти идентификаторы не употребляются без индексных выражений.

Прерывания

Прерывание - это особое состояние вычислительного процесса. В момент прерывания нарушается нормальный порядок выполнения команд программы и управление передается специальной процедуре, которая входит в состав ДОС и называется процедурой обработки прерывания. Каждое прерывание характеризуется в рамках ДОС порядковым номером и связано со своей процедурой обработки. В архитектуре центрального процессора ПК предусмотрены прерывания двух типов - аппаратные и программные. Аппаратные прерывания создаются схемами контроля и управления ПК и сигнализируют операционной системе о переходе какого-либо устройства в новое состояние или о возникновении неисправности. Программные прерывания инициируются при выполнении одной из двух специальных команд микропроцессора (INT или INTO) и служат для обращения к средствам ДОС.

Описываемые ниже процедуры входят в состав библиотечного модуля DOS.TPU и становятся доступными после объявления USES DOS. При возникновении программного прерывания в большинстве случаев необходимо передать процедуре обработки прерывания некоторые параметры, в которых конкретизируется запрос нужной функции. Эти параметры, а также выходная информация (результат обработки прерывания) передаются от программы к процедуре и обратно через регистры центрального процессора. В составе модуля DOS.TPU для этих целей определен специальный тип:

type

Registers = record case integer of

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

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

end ;

Этот тип имитирует регистры центрального процессора и дает возможность обращаться к ним как к 16-битным или 8-битным регистрам.

Процедура INTR. С помощью этой процедуры инициируется программное прерывание с требуемым номером. Обращение:

INTR (<N>,<регистры>)

Здесь <N> - выражение типа BYTE; номер прерывания;

<регистры> - переменная типа REGISTERS; в этой переменной процедуре обработки прерывания передается содержимое регистров и в ней же возвращается выходная информация.

Например, прерывание с номером 18 ($12) возвращает в регистре АХ объем оперативной памяти ПК. Короткая программа, представленная в примере 11.1, выведет на экран сообщение об этом объеме.

Пример

Uses DOS; 

var

r : registers; 

begin

Intr ($12, r); 

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

end.

Процедура MSDOS. Инициирует прерывание с номером 33 ($21). Формат обращения:

MSDOS (<регистры>)

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

Пример

Uses DOS; 

var

r : registers; 

begin

r.АН := $30;

MsDos(r);

WriteLn('Версия операционной системы: ', r.AL, '.' r.АН) 

end.

Обработка прерываний

При написании процедур обработки прерываний существенными являются два обстоятельства. Во-первых, процедура обработки прерывания не должна искажать работу прерванной программы. Для этого необходимо сначала сохранить регистры центрального процессора, а перед выходом из процедуры - восстановить их. Во-вторых, процедура должна строиться по принципу реентерабельности (повторной входимости): ее работа может быть прервана в любой момент другими прерываниями и ДОС может обратиться к соответствующей функции до завершения обработки предыдущего прерывания.

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

Процедура обработки прерывания, написанная на Турбо Паскале, должна начинаться стандартной директивой INTERRUPT (прерывание), например:

Procedure IntProc (Flags, CS, IP, AX, BX, CX, DX,

SI, DF, DS, ES, BP : word); inerrupt; 

begin

...

end ;

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

Procedure IntProc(SI, DP, ES: word); interrupt; 

будет неверным (опущены параметры DS и ВР); правильное описание:

Procedure IntProc(SI, DP, DS, ES, BP: word); interrupt;

Заметим, что компилятор не контролирует порядок перечисления параметров в заголовке процедуры обработки прерывания.

Директива INTERRUPT вызывает генерацию специальных машинных кодов, обеспечивающих заталкивание регистров в стек при входе в процедуру и извлечение их из стека перед выходом из нее.

В самой процедуре обработки прерывания не рекомендуется обращаться к другим функциям ДОС, так как некоторые из них, в том числе все функции ввода-вывода, нереентерабельны.

Для связи с любыми процедурами прерываний, а следовательно, и с процедурами, написанными программистом, используются векторы прерываний - четырехбайтные абсолютные адреса точек входа в эти процедуры. Векторы прерываний располагаются в младших адресах оперативной памяти, начиная с нулевого адреса: прерывание номер 0 - по адресу 0, номер 1 - по адресу 1*4 = 4, номер N - по адресу N * 4. С помощью следующих двух процедур программист может прочитать содержимое любого вектора или установить его новое значение.

Процедура GETINTVEC.

Возвращает вектор прерывания с указанным номером. Обращение:

GETINTVEC (<,<вектор>)

Здесь <D> - выражение типа BYTE; номер прерывания;

<вектор> - переменная типа POINTER; адрес точки входа в процедуру обработки прерывания.

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

Пример

Uses DOS; 

var

i : byte; p : pointer; 

begin

for i := 0 to 255 do 

begin

GetlntVec (i, p) ;

if (Seg (р) <> 0) or (Ofs (рл) <> 0) then 

WriteLn (' N=', i:3, ' Seg=', Seg (р):5,

' Ofs =' , Ofs (р) :5) 

end 

end.

Процедура SETINTVEC.

Устанавливает новое значение вектора прерывания. Формат обращения:

SETINTVEC (<D>,<адрес>)

Здесь <D> - выражение типа BYTE; номер прерывания;

<адрес> - выражение типа POINTER; адрес точки входа в процедуру обработки прерывания.

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

Структура резидентной программы. Вызов исполняемых программ. Передача параметров вызываемым программам. Процедурные типы. Передача функций в качестве параметров.

Структура резидентной программы.

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

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

1.) сохраняет векторы "захватываемых" прерываний во внутренних переменных;

2.) устанавливает эти векторы по адресу резидентной части программы;

3.) инициализирует внутренние переменные резидентной части;

4.) завершает работу программы без удаления резидентной части из памяти компьютера.

С того момента как резидентная часть программы находится в ОЗУ, и на нее указывает вектор "захваченного" прерывания, она может быть активизирована путем вызова этого прерывания.

Построение резидентной части может осуществляться по трем схемам выполнения.

В схеме "А" сначала вызывается системная обработка, а затем производится добавочная пользовательская обработка, написанная программистом. Эта схема подходит в том случае, когда программист хочет чем-либо дополнить системную обработку. Например, можно заставить машину менять по нажатию клавиш Ctrl-Alt атрибуты яркости символов на противоположные.

(* Резидентная программа, которая при

нажатии клавиш Ctrl-Alt генерирует звук *)

{$M 3000,0,3000}                                                    (* Резервирование памяти *)

uses crt,dos;

program resident_example (input,output);

var

            i:word;

            ch:char;

            int9:procedure;

            logr:boolean;

{$F+}

(* РЕЗИДЕНТНАЯ ЧАСТЬ ПРОГРАММЫ *)

procedure pressbutton(flags,CS,IP,AX,BX,CX,DX,SI,DI,ES,DS,BP:word);interrupt;

var

            b:byte;

            i:word;

begin

            inline($9c);                                          (* Имитация прерывания (PUSHF) *)

            int9;                                                    (* Вызов системной обработки *)

            b:=mem[$0000:$0417];                                  (* Чтение флагов клавиатуры *)

            if ((b and 12)=12) and (logr) then                    (* Проверка нажатия Ctrl-Alt *)

            begin

                        logr:=false;

                        i:=500;

                        while i<=1000 do                                (* Программирование динамика *)

                        begin

                                   sound(i);

                                   delay(1);

                                   inc(i,20);

                        end;

                        nosound;

                        logr:=true;

            end;

            if (b and 5)=5 then                               (* Проверка нажатия RightShift-Ctrl *)

                        setintvec($9,addr(int9));                      (* Восстановление захваченного вектора *)

end;

                                                                       (* Возврат управления *)

{$F-}

(* ВСПОМОГАТЕЛЬНАЯ ЧАСТЬ ПРОГРАММЫ *)

begin

            getintvec($9,@int9);                            (* Сохранение вектора 09H *)

            setintvec($9,addr(pressbutton));                      (* Установка вектора 09H *)

            logr:=true;                                           (* Инициализация внутренней переменной *)

            keep(0);                                                          (* Выход с сохранением памяти *)

end.

Вызов исполняемых программ

Из программы, написанной на Турбо Паскале, можно запустить любую другую готовую к работе программу. Для этого используется процедура ЕХЕС из библиотечного модуля DOS. Формат обращения к процедуре:

ЕХЕС (<имя>,<параметры>)

Здесь <имя> - выражение типа STRING; имя файла с вызываемой программой; <параметры> - выражение типа STRING; параметры вызова.

Имени запускаемой программы может предшествовать путь к файлу. Параметры передаются запускаемой программе в виде текстовой строки и могут быть проанализированы ею с помощью двух следующих функций.

Передача параметров вызываемым программам.

Функция PARAMCOUNT.

Возвращает общее количество параметров вызова программы (значение типа WORD). Обращение:

PARAMCOUNT

Параметры вызова обычно следуют в командной строке ДОС сразу за именем вызываемой программы и отделяются от этого имени и друг от друга пробелами, например:

C:\TP\TURBO MYPROG.PAS 

C:\SIAM A:\SYSTEM1.SIA

Здесь MYPROG.PAS и A:\SYSTEM1.SIA - параметры, передаваемые программам TURBO и SIAM.

При вызове программы непосредственно из среды Турбо Паскаля ей можно передать параметры с помощью опции OPTIONS/PARAMETERS (см. прил.1).

Функция PARAMSTR.

Возвращает значение типа STRING, соответствующее нужному параметру вызова. Формат обращения:

PARAMSTR (<D>)

Здесь <D> - выражение типа WORD; порядковый номер параметра.

Заметим, что программе всегда передается параметр, соответствующий N = 0. В этом параметре ДОС сообщает полное имя запущенной программы с указанием диска и каталога, откуда она была загружена.


 

А также другие работы, которые могут Вас заинтересовать

75416. Оптичні давачі. Давачі дифузного типу 2.47 MB
  Давачі дифузного типу Давач дифузного типу створений за принципом давача з відбиттям від рефлектора. Давачі дифузного типу Давач дифузного типу з придушенням заднього фону Давачі дифузного типу з придушенням заднього фону були розроблені для того щоб досягти визначеного діапазону сканування для будьяких обєктів незалежно від їх яскравості кольору та інших властивостей а також від яскравості заднього фону. Такі давачі ігнорують всі обєкти які знаходяться до давача ближче ніж попередньо налаштований діапазон виявлення.
75417. Безконтактний магніточутливий давач 262 KB
  Давач що виявляє зміну напруженості постійного магнітного поля має напівпровідниковий комутуючий елемент і що не містить рухомих частин в чутливому елементі рис. Спрацювання давача відбувається при зміні напруженості магнітного поля викликаного наприклад переміщенням постійного магніту розташованого на рухомої частини механізму. Крім того магніточутливих давачи можуть відрізнятися по реакції на зміну магнітного поля: При збільшенні напруженості зовнішнього магнітного поля наприклад при наближенні постійного магніту...
75418. Блоки живлення, лічильники імпульсів, реле часу, сигналізатори рівня, розєми і зєднувачі, вибухобезпечне устаткування 753.5 KB
  Блок живлення — це вторинне джерело живлення, призначене для забезпечення живлення електроприладу електричною енергією, при відповідності вимогам її параметрів: напруги, струму, і т. д. шляхом перетворення енергії інших джерел живлення.
75419. Сенсори. Аналогові сенсори. Сенсори положення, кута, віддалі та товщини 575 KB
  Сенсори положення кута віддалі та товщини. Аналогові сенсори За допомогою аналогових сенсорів перетворюють механічні величини наприклад зміну положення або електричні величини наприклад зміну потужності на електричні сигнали напруги або струму. Сигнали з вимірювального перетворювача можуть бути представлені у фізичних величинах наприклад у випадку перетворювача положення в мм. Сенсори положення кута віддалі та товщини Потенціометричні контактні сенсори При пересуванні ковзного контакту в поступальному потенціометрі або повороту...
75420. Індуктивні безконтактні кінцеві сигналізатори 568 KB
  Котушка з відкритим, чашковим феромагнітним осердям створює високочастотне електромагнітне поле. Котушка є індуктивною частиною коливного контуру, який збуджується за допомогою частотного генератора з частотою близько
75421. Сенсори розтягу, сили, обертового моменту i тиску 585 KB
  Види виконання вимірювальних сіток фольгових тензометрів Для одночасного вимірювання в кількох напрямках служать спеціальні тензометри в яких вимірювальні сітки розміщені одна відносно іншої під кутом 120 або під кутом 45 до напрямку видовження рис.
75422. Сенсори прискорення. Сенсори температури 164 KB
  Сенсори температури. Сенсори температури Найважливішим різновидом давачів є давачі температури оскільки багато процесів у тому числі і в повсякденному житті регулюються температурою наприклад: регулювання опалення на підставі вимірювання температури теплоносія на вході і виході а також температури в приміщенні і зовнішньої температури; регулювання температури води в пральній машині; регулювання температури електропраски електроплитки духовки...
75423. Бінарні сенсори. Цифрові сенсори 480 KB
  Бінарні сенсори влаштовані як реле (перемикачі) або як аналогові сенсори з перемикачем порогового значення. Коли вхідна величина сенсора досягає порогу перемикання, бінарний вихідний сигнал змінює значення. Під час зміни вхідної величини у зворотному напрямі, по досягненню порогового значення...
75424. Інкрементальні сенсори положення. Кодові лінійки і диски абсолютних сенсорів 631 KB
  Інкременгальні сенсори переміщення оснащені лінійкою з рисковими поділками. Читання положення рисок здійснюється оптичними або магнітними методами. В сенсорах через які проходить світло використовуються скляні лінійки з рисками які поглинають світло і проміжками які пропускають світло шириною 4 мкм рис. Пристрої які зчитують це складаються з потужного джерела світла зчитувальної пластинки і електронної системи аналізу.