Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
программирование 2 семестр 1 курс.docx
Скачиваний:
0
Добавлен:
01.05.2025
Размер:
523.82 Кб
Скачать

Внешние подпрограммы.

Имеется возможность использования при компиляции и компоновке программ вместо подпрограмм виде объектных кодов (obj – файлов ), созданных другими компиляторами . Obj - файлы должны при этом удовлетворять и использовать модели памяти и способы передачи значений . Разработчиками гарантируется совместимость кодов , полученных компиляторами Turbo и макси _________ и файлов , скомпонованных по стандарту .

Поскольку подпрограмма образованна в других языках программирования , имеет интерфейс отличный от языка описания Paskal , должны быть выполнены некоторые действия по совместимости интерфейса . Например при подключении Obj – файлом созданного на ассемблере , сегмент кода и сегмент данных , определяется в ассемблере , должны иметь определенные названия а параметры различной длинны должны передаваться через различные определенные регистры . Для подключении объектных файлов используется директива компилятора :{$L «имя файла ».obj}

Подпрограммы реализованные в подключенных файлах которые предполагают использовать в основной программе , должны быть объявлены в основной программе заголовка с директивой :External.

Пример

{$L a.obj}

Procedure p1 ; external;

Procedure p2 (x:byte); external;

Function F1 (c : char ):byte ; external;

Procedure p;

Begin

……

End;

…….

Подключают таким образом внешние подпрограммы использующиеся в основной программе аналогично обычным подпрограммам. Обычно директиву {$L «имя файла ».obj}

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

Asm

«юникод ассемблера »

End;

Пример подключения графического драйвера и графичесих шрифтов в ехе –файле

Пусть необходимо “ прошить “ в ехе –файл стандартный драйвер egavga.bgi и два шрифта : trip.chr и goth.chr .

  1. Преобразуем бинарные файлы bgi и chr в obj-файл . Используются утилиты системы MS Dos:

BINOBJ «имя бинарного файла » « имя obj –файла» «имя подпрограммы »

Имя подпрограммы используется при подключается с помощью директивы {$L}

BINOBJ egavga.obj egavga.obj dr

BINOBJ trip.chr trip.obj trip

BINOBJ goth.chr goth.obj goth

После выполнения данных утилит будет получено три объектных файла

  1. Пример подпрограммы подключения

Uses graph ;

Var

Gd,gm:integer;

{$L egavga.obj}

Procedure dr ; external;

{$L trip.obj}

Procedure trip; external ;

{$L goth.obj}

Procedure goth; external;

Begin

Gd:=9;

Gm:=1;

Register bgidriver(@dr);

Register bgiFont(@trip);

Register bgiFont(@dgth);

Initgraph (gd,gm, ‘ ’);

..

Closegraph;

End.

Процедура Register bgidriver используется для загрузки драйвера в память . В качестве параметра используется адрес процедуры , связанной с драйвером процедуры Register bgifont загружается шрифт в память (поддерживает таблицу из m шрифтов , в Паскале – 4 шрифта + default (по умолчанию )).

Процедуры и функции как параметры подпрограмм .

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

Чтобы использовать подпрограмму в качестве параметра , необходимо определить функциональный или процедурный тип ( в зависимости от того , что передается в качестве параметра ).

Функциональный (процедурный ) тип представляет собой тип заголовка подпрограммы , в котором указывается имя типа , ключевое слово , определяющее процедуру или функцию , набор параметров и тип возвращаемого значения , если описывается функциональный тип .

Type

Type_func=function (p:real ; I:integer ):char ;

Type_prac = procedure (a:Boolean );

При таком описании имя подпрограмм не задаются , идентификаторы параметров задаются произвольно . Основной смысл заключается в порядке следования и типах параметра . Необходимо описать реальные подпрограммы , которые будут использоваться как параметры . Данные подпрограммы должны быть описаны как подпрограммы дальнего вызова поскольку при передачи их в качестве параметров необходим полный адрес их размещения : {$F+}; {$F-}; Far.

Пример использования функций в качестве параметров подпрограмм – подсчет определенного интеграла методом треугольника :

= h= const

, i=1,2,..,n

Основные переменные – параметры :функция Integral , параметры а – нижний , в – верхний пределы интегрирования , h – шаг интегрирования , Res – результат, ff – функция – параметр , определяющая подынтегральное выражение .

Type

Type_func= function (x_t: real): real;

Var

{$F+}

Function f (x_tmp :real): real;

Begin

F:=1/ (1 + sqr (x_tmp)); { }

End;

{$F-}

Procedure integral (a, b ,h: real; var res:real; ff :type_func);

Var

X:real ;

Begin

X:=a;

Res:=a;

While (x<=h) do

Begin

Res:=res +h*ff(x+h/2);

X:=x+h;

End;

End;

Begin

Integral (0 , 1 , 0,001,I,f);

Write (i:6:4);

End.

Организация памяти .

Лекция №7

Ссылочный и указательный типы данных. Организация памяти. Типы распределения памяти (статическая, динамическая). Ссылочный тип данных. Работа с адресами. Указатель. Основные операции с ссылочными переменными.

В режиме DOS процессор позволяет адресовать до 1 мегабайта памяти . Обращение к памяти ведется через регистры – указатели , в которых содержаться адреса ячеек памяти , к которым осуществляется обращение (SP- обращение к стеку , ВР – дополнительный указатель стека , IP- указатель команд, SI,DI - индексные регистры ). Эти регистры имеют разрядность 16 бит , в связи с этим прямой доступ к памяти через эти регистры возможен только к 64 кб памяти . Эти 64 кб называют сегментом памяти . Таким образом память организована как последовательность таких сегментов . Для того , чтобы обратиться к какой-либо ячейки необходимо указать ее адрес , который при такой организации памяти представляет собой послать из двух cлов : адрес сегмента (16 бит ) и адрес смещения(16 бит ) .

Фактически для адресации ячейки памяти вычисляется 20 битный физический адрес . Для вычисления этого адреса используется 2 регистра : 1.сегментный регистр (адрес сегмента ) 2. Указательный регистр выделяются 4 сегментных регистра : 1) CS –сегментный регистр кода 2) DS – сегмент регистр данных 3) SS – сегментный регистр стЭка 4) ES – дополнительный ( расширенный ) сегментный регистр данных.

Физический 20 битный адрес вычисляется следующим образом : значение сегментного регистра сдвигается влево на одну 16тиричную цифру и к нему добавляется адреса смещения .

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