34661

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

Реферат

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

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

Русский

2013-09-08

66 KB

8 чел.

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

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


 

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

39506. Создание электронное учебно-методического пособие «Политология» 44.33 KB
  Бурное развитие вычислительной техники потребность в эффективных средствах разработки программного обеспечения привели к появлению систем программирования ориентированных на так называемую быструю разработку среди которых можно выделить C Builder. C Builder программный продукт инструмент быстрой разработки приложений RAD интегрированная среда программирования IDE система используемая программистами для разработки программного обеспечения на языке программирования C. C Builder объединяет в себе комплекс объектных...
39507. ЭЛЕКТРОННОЕ СРЕДСТВО ОБУЧЕНИЯ И ТЕСТИРОВАНИЯ ПО ДИСЦИПЛИНЕ «ОСНОВЫ СОЦИАЛЬНО-ГУМАНИТАРНЫХ НАУК. ПОЛИТОЛОГИЯ» 219.28 KB
  Это задается следующими строками: int ocenka = 0; { AnsiString otvety= ; for int k = 0; k kolv; k { ocenka = ocenka kRight[k]; if kRight[k]==1 otvety = otvety IntToStrk1; } Загрузка вопросов в RadioGroup производится следующим образом: RadioGroup1 Items Clear; while j q ChildNodes Count { RadioGroup1 Items Addq ChildNodes Nodes[j] Text; j; } } if i = qw ChildNodes Count BitBtn3 Click; } ОБОСНОВАНИЕ ПРИЕМОВ ПРОГРАММИРОВАНИЯ ОС Windows XP Windows XP кодовое название при разработке Whistler;...
39508. Оценка размера вреда (ущерба) имуществу при наступлении страхового случая 1.22 MB
  Основные понятия и определения Оценка определение стоимости объекта оценки. Внутренняя оценка оценка проводимая самостоятельно юридическими и физическими лицами в том числе индивидуальными предпринимателями на основании собственного решения без привлечения исполнителя оценки. Результат внутренней оценки не может использоваться в случаях если в соответствии с законодательными актами оценка должна быть только независимой [3].
39509. Оценка размеров вреда при наступлении страховых случаев 3.44 MB
  В процессе работы выполнены следующие исследования: проанализировано существующее положение дел в области определения размера вреда в Республике Беларусь; сделан анализ зарубежной практики оценки имущества для целей возмещения убытков связанных с наступлением страховых случаев; разработаны предложения по определению размера вреда связанных с наступлением страховых случаев. Общие сведения об объекте оценки [1. Определение ориентировочных размеров убытков причиняемых полным разрушением капитального строения жилого дома в котором...
39511. Служебно-представительское здание в монолитном каркасе, расположенное в сейсмически активной зоне 1.37 MB
  Подбор сечения арматуры. Расчет поперечной арматуры. Стык осуществляемый путей сварки выпусков арматуры и укладки бетона в зоне соединения [4. Основные расчетные формулы Принимаем Полная высота плиты h=h0a=457514=5975 мм где а=10d 2=108 2=14 мм 10 мм защитный слой d=8 мм предполагаемый диаметр рабочей продольной арматуры Принимаем толщину плиты 100 мм.
39512. Спорткомплекс с залом площадью 730 м2 1.14 MB
  Организация строительного производства должна быть направлена на уменьшение сроков строительства при высоком качестве работ и минимальных затратах труда материальных ресурсов и денежных средств. Основными направлениями НТП в области строительства являются: концентрация предприятий в составе промышленных узлов в которых предусматривается комплексная переработка сырья без создания отвальных зон. Это создает условия для массового внедрения принципов поточного производства; снижение мощности строительства в области строительного...
39513. Семиэтажный жилой дом из монолитного железобетона 1.26 MB
  ПОПЕРЕЧНАЯ РАМА МОНОЛИТНОЕ ПЕРЕКРЫТИЕБАЛКА КОЛОННА РАСЧЕТ НАГРУЗКА ФУНДАМЕНТ РАСЧЁТНОЕ СЕЧЕНИЕ Объектом разработки является семиэтажный жилой дом из монолитного железобетона. Цель проекта разработка несущих конструкций. В процессе работы проектирования выполнены следующие исследования разработки: запроектированы и рассчитаны элементы монолитного каркаса перекрытие колонна фундамент.
39514. Крытая хоккейная площадка общей площадью 2800м2 178 KB
  Нагрузки и воздействия. Переходя с одного элемента на другой нагрузки и воздействия постоянно меняются принимая форму нормальных и поперечных сил изгибающих и крутящих моментов а в тесных рамках тонкостенных стержней преобразуются в изгибнокрутящие бимоменты или другие более сложные формы.85 Нагрузки и воздействия.1 Нагрузки и воздействия Место строительства г.