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. В этом параметре ДОС сообщает полное имя запущенной программы с указанием диска и каталога, откуда она была загружена.


 

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

32673. Образовательный процесс как система 59.5 KB
  Уровни образовательного процесса. Компоненты и структура образовательного процесса. В образовательном учреждении можно выделить большое разнообразие образовательных систем: целостный педагогический образовательный процесс процесс обучения; процесс воспитания учебное занятие Понятие процесса образовательного процесса.
32675. Понятие управления и педагогического менеджмента 127.5 KB
  Усложняются задачи управления. Отметим что в российской практике управления образовательными учреждениями а капитана корабля естественно сравнивать с руководителем школы или образовательного учреждения иного типа управленческие цели продолжают ставить чаще всего исходя из анализа состояния образовательного процесса то есть заказ является внутренним а не исходя из изменяющихся общественных потребностей внешний по отношению к учреждению заказ. На следующем этапе управления капитану необходимо построить уже конкретную программу...
32676. Эволюция управленческой мысли 55.5 KB
  Фредерик Уинслоу Тейлор опубликовал книгу Принципы научного управления. Выделяются 4 важнейших подхода: Подход с позиций выделения различных школ управления иначе его называют классическим или традиционным подходом Первая половина ХХ века 18851950 Школа научного управления 18851920 Административная школа 19201950 Школа психологии и человеческих отношений 19301950 Школа науки управления количественная школа 1950 1.Ситуационный подход 1960 Характеризуется тем что пригодность различных методов управления...
32677. Основные функции управления (педагогического менеджмента) 290.5 KB
  Планирование как функция управления Функция управления – контроль. Процесс управления 1. Понятие функции управления Каждая система которая создаётся нужна для чегото.
32678. ИНФОРМАТИКА В 10 КЛАССЕ. КОНСПЕКТЫ УРОКОВ 986 KB
  Учебное методическое пособие предполагает наличие в школьном кабинете информатики IBM-совместимых компьютеров, организованных в локальную сеть, а также программного обеспечения: операционной системы Windows, системы программирования PascalABC, ЭТ Microsoft Excel, браузера Internet Explorer, программ Movie Maker, Net Meeting, Skype.
32679. РЕСТРУКТУРИЗАЦИЯ БИЗНЕСА В РОССИИ 98 KB
  В процессе реструктуризации может происходить совершенствование системы управления предприятием, изменение финансово-экономической политики, операционной деятельности, систем маркетинга, сбыта и управления персоналом
32680. Детальний маркетинговий аналіз препарату «Арбідол» 364.5 KB
  Інтерферон безпосередньо не інактивує віруси або їх нуклеїнові кислоти, не перешкоджає адсорбції і проникненню вірусу в клітину, а також його депротеїнізації. Інтерферон проявляє свою дію на внутрішньоклітинному етапі репродукції вірусу. Механізм взаємодії інтерферону з клітинами, в яких він індукує антивірусний стан
32681. Гемопоэз 102 KB
  Процесс образования и развития клеток крови – гемопоэз кроветворение. Чтоб гемопоэз протекал нормально он должен быть обеспечен всем необходимым для построения клеток крови. Анемия – состояние при котором снижается способность крови переносить кислород т. Железо адсорбируется главным образом в тонком кишечнике при дефиците Fe и его высокое содержание в крови уменьшает адсорбцию.