Лекция 27.ppt
- Количество слайдов: 24
Доступ к системным ресурсам. Определение переменной как Absolute. Предопределенные массивы MEM. Вызов исполняемых программ. Прерывания. Обработка прерываний Лекция 27
Доступ к системным ресурсам Работая с программой на языке Паскаль, иногда вам потребуется составить программу на ассемблере или сделать вызов системной программы. Это может потребоваться для ускорения вашей программы или для обеспечения доступа к некоторому специальному оборудованию, применение которого непосредственно в Паскале не предусмотрено. В операционной системе MS-DOS доступ к системным функциям осуществляется посредством программных прерываний. Каждое прерывание позволяет сделать обращение к функциям определенной категории. Тип функции определяется значением регистра АН. Дополнительная информация при необходимости передается через регистры AL, BX, CX и DX.
Абсолютные переменные Память для переменных, объявленных в разделе Var, выделяется при старте блока, в котором содержится данный раздел, в порядке объявления имен переменных. Местоположение блока в пространстве оперативной памяти ЭВМ определяет операционная система. В то же время Турбо Паскаль предоставляет возможность программисту так описать переменные, чтобы им были назначены заранее заданные адреса. Такие переменные называются абсолютными; их описание после имени типа должно содержать так называемое абсолютное предложение.
Структура абсолютного предложения имеет два альтернативных варианта. • В первом варианте производится задание абсолютного адреса в форме, принятой в операционной системе MS DOS. Var идентификатор : тип Absolute сегмент: смещение; • Во втором варианте для абсолютной переменной назначается адрес другой, ранее объявленной переменной. Var идентификатор : тип Absolute переменная;
• Первая форма непосредственно задает адрес (сегмент и смещение) переменной. Оба значения должны быть внутри диапазона $0000. . $FFFF (от 0 до 65 535). • Вторая форма объявления размещает новую переменную поверх существующей переменной (по тому же самому адресу). Если в списке переменных присутствует слово Absolute, то в данной строке может находиться только одна переменная. Используйте первую форму объявления осторожно. Во время работы Windows в защищенном режиме ваше приложение не может иметь прав доступа к областям памяти вне вашей программы. Вторая форма объявления абсолютных переменных безопасна для приложений Windows. Память, к которой вы обращаетесь, находится внутри области памяти вашей программы.
Пример 1. Type SChar = record Symbol : char; Attr : byte; end; SAr = array[1. . 25, 1. . 80] of SChar; Var y : real absolute $A 100: $0000; Screen : SAr absolute $B 800: $0000; Здесь переменным y и Screen назначаются конкретные адреса оперативной памяти. В частности, значение $B 800: $0000 определяет фиксированный адрес видеопамяти.
Пример 2. Type Byte. Ar = array[1. . 2] of byte; Var y : word; B : Byte. Ar absolute y; Begin B[1]: =10; B[2]: =20; Writeln(y, ' ', B[1], ' ', B[2]); y: =2500; Writeln(y, ' ', B[1], ' ', B[2]); End; В результате работы программы на экране будет: 5130 10 20 2500 196 9 Переменные y и B адресуют одно и то же поле памяти, т. е одно и то же поле памяти размером два байта имеет два имени: y и B. Если в программе используется имя y, то это поле можно обрабатывать как переменную типа word, для имени B допустимые операции определяются именем типа Byte. Ar.
Предопределенные массивы MEM Эти массивы используются для прямого доступа к оперативной памяти, интерпретируя память как состоящую из элементов различного формата. В Турбо Паскале имеются предварительно объявленные массивы: MEM, MEMW, MEML, PORT и PORTW. Первые три обеспечивают доступ к любому участку оперативной памяти по абсолютному адресу, два других - доступ к портам вводавывода. Компонентами массива MEM являются данные типа BYTE, массива MEMW - типа WORD, массива MEML - типа LONGINT.
Обращение к элементам этих массивов, т. е. их индексация, имеет специальный вид: каждый индекс представляет собой абсолютный адрес и состоит из двух выражений типа WORD; первое дает сегментную часть адреса, второе - смещение; выражения разделяются двоеточием. Например: Меm[$0000: $1000] : = 0; Data. Mem : = Mem. W[Seg(p): 0 fs(p)]; Mem. Long : = Mem. L[64 : i*Size. Of (real) ] ;
Компонентами массива PORT являются байты (тип BYTE), а массива PORTW - слова (тип WORD). Индексами этих массивов должно быть выражение типа BYTE, указывающее номер нужного порта. Присвоение значения элементу массива PORT или PORTW приведет к записи в порт, упоминание элемента в выражении - к чтению из порта. Компоненты массивов PORT и PORTW нельзя передавать в качестве параметров процедурам или функциям.
Вызов исполняемых программ Из программы, написанной на Турбо Паскале, можно запустить любую другую готовую к работе программу. Для этого используется процедура ЕХЕС из библиотечного модуля DOS. Формат обращения к процедуре: ЕХЕС (<имя>, <параметры>) Здесь <имя> — выражение типа STRING; имя файла с вызываемой программой; <параметры> — выражение типа STRING; параметры вызова. Имени запускаемой программы может предшествовать путь к файлу. Параметры передаются запускаемой программе в виде текстовой строки и могут быть проанализированы ею с помощью двух следующих функций.
Функция PARAMCOUNT. Возвращает общее количество параметров вызова программы (значение типа WORD). Обращение: PARAMCOUNT Параметры вызова обычно следуют в командной строке ДОС сразу за именем вызываемой программы и отделяются от этого имени и друг от друга пробелами, например: C: TPTURBO MYPROG. PAS Здесь MYPROG. PAS - параметр, передаваемый программе TURBO. При вызове программы непосредственно из среды Турбо Паскаля ей можно передать параметры с помощью опции OPTIONS/PARAMETERS
Функция PARAMSTR. Возвращает значение типа STRING, соответствующее нужному параметру вызова. Формат обращения: PARAMSTR (<D>) Здесь <D> — выражение типа WORD; порядковый номер параметра.
Прерывания Прерывание — это особое состояние вычислительного процесса. В момент прерывания нарушается нормальный порядок выполнения команд программы и управление передается специальной процедуре, которая входит в состав ДОС и называется процедурой обработки прерывания. Каждое прерывание характеризуется в рамках ДОС порядковым номером и связано со своей процедурой обработки. В архитектуре центрального процессора ПК предусмотрены прерывания двух типов - аппаратные и программные. Аппаратные прерывания создаются схемами контроля и управления ПК и сигнализируют операционной системе о переходе какого-либо устройства в новое состояние или о возникновении неисправности.
Программные прерывания инициируются при выполнении одной из двух специальных команд микропроцессора (INT или INTO) и служат для обращения к средствам ДОС. Программные прерывания предназначены для упрощения вызова служебных функций систем MS-DOS и BIOS, так как для вызова их функций программе вовсе не нужно знать точный адрес расположения кода этих функций, а достаточно лишь знать номер сервисного программного прерывания. Процесс прерывания проходит в три стадии: 1. ) приостановка выполнения основного процесса; 2. ) обработка прерывания; 3. ) возврат управления основному процессу. Описываемые ниже процедуры входят в состав библиотечного модуля DOS. TPU и становятся доступными после объявления USES DOS.
При возникновении программного прерывания в большинстве случаев необходимо передать процедуре обработки прерывания некоторые параметры, в которых конкретизируется запрос нужной функции. Эти параметры, а также выходная информация (результат обработки прерывания) передаются от программы к процедуре и обратно через регистры центрального процессора. В составе модуля DOS. TPU для этих целей определен специальный тип: type Registers = record case integer of 0 : (AX, BX, CX, BP, SI, DS, ES, Flags : word); 1 : (AL, AH, BL, BH, CL, CH, DL, DH : byte) end ;
Процедура INTR. С помощью этой процедуры инициируется программное прерывание с требуемым номером. Обращение: INTR (<N>, <регистры>) Здесь <N> - выражение типа BYTE; номер прерывания; <регистры> - переменная типа REGISTERS; в этой переменной процедуре обработки прерывания передается содержимое регистров и в ней же возвращается выходная информация. Например, прерывание с номером 18 ($12) возвращает в регистре АХ объем оперативной памяти ПК. Uses DOS; var r : registers; begin Intr ($12, r); writeln ('Объем памяти = ', r. AX, ' Кбайт') end.
Всего в ДОС имеется около 40 программных прерываний, каждое из которых может активизировать одну или несколько функций ДОС. Одно из прерываний - с номером 33 обеспечивает доступ к 85 функциям, а всего в ДОС имеется более 200 разнообразных функций. Процедура MSDOS. Инициирует прерывание с номером 33 ($21). Формат обращения: MSDOS (<регистры>) Рассматриваемая процедура полностью эквивалентна вызову процедуры INTR с номером прерывания 33.
Обработка прерываний При написании процедур обработки прерываний существенными являются два обстоятельства. Во-первых, процедура обработки прерывания не должна искажать работу прерванной программы. Для этого необходимо сначала сохранить регистры центрального процессора, а перед выходом из процедуры — восстановить их. Во-вторых, процедура должна строиться по принципу реентерабельности (повторной входимости): ее работа может быть прервана в любой момент другими прерываниями и ДОС может обратиться к соответствующей функции до завершения обработки предыдущего прерывания.
Процедура обработки прерывания, написанная на Турбо Паскале, должна начинаться стандартной директивой INTERRUPT (прерывание), например: Procedure Int. Proc (Flags, CS, IP, AX, BX, CX, DX, SI, DF, DS, ES, BP : word); interrupt; begin . . . end ; Формальные параметры в заголовке процедуры должны перечисляться в указанном порядке — через эти параметры все регистры прерванной программы становятся доступны процедуре обработки прерывания. Количество перечисляемых в заголовке процедуры параметроврегистров может быть любым, но не больше 12. Если в списке опущен какой-либо параметр, должны быть опущены также и все предшествующие ему параметры.
Директива INTERRUPT вызывает генерацию специальных машинных кодов, обеспечивающих заталкивание регистров в стек при входе в процедуру и извлечение их из стека перед выходом из нее. В самой процедуре обработки прерывания не рекомендуется обращаться к другим функциям ДОС, так как некоторые из них нереентерабельны. Для связи с любыми процедурами прерываний используются векторы прерываний - четырехбайтные абсолютные адреса точек входа в эти процедуры. Векторы прерываний располагаются в младших адресах оперативной памяти, начиная с нулевого адреса: прерывание номер 0 — по адресу 0, номер 1 — по адресу 1*4 = 4, номер N — по адресу N * 4. С помощью следующих двух процедур программист может прочитать содержимое любого вектора или установить его новое значение.
Процедура GETINTVEC. Возвращает вектор прерывания с указанным номером. Обращение: GETINTVEC (<D>, <вектор>) Здесь <D> — выражение типа BYTE; номер прерывания; <вектор> — переменная типа POINTER; адрес точки входа в процедуру обработки прерывания. Процедура SETINTVEC. Устанавливает новое значение вектора прерывания. Формат обращения: SETINTVEC (<D>, <адрес>) Здесь <D> - выражение типа BYTE; номер прерывания; <адрес> — выражение типа POINTER; адрес точки входа в процедуру обработки прерывания.
При нормальном завершении программы она выгружается из памяти. Вы можете прекратить работу программы и оставить ее резидентной в памяти, если воспользуетесь процедурой KEEP.
Домашнее задание 1. Составить опорный конспект лекции по теме «Доступ к системным ресурсам» на основе презентации. 2. Turbo Pascal. Немнюгин С. А. СПб. : Питер, 2002, cтр. 148155.
Лекция 27.ppt