Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Информатика [РТФ, Андреев, 2 семестр] / Экзамен (для печати).docx
Скачиваний:
16
Добавлен:
05.08.2022
Размер:
1.25 Mб
Скачать
  1. Внешние процедуры (функции) в Паскале.

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

Внешняя процедура (функция) в программе, написанной на Турбо Паскале, объявляется своим заголовком, за которым следует стандартная директива EXTERNAL, например: Function Fun(a : byte); external;

Для подключения ассемблерной программы необходимо предварительно ее откомпилировать и получить объектный файл с расширением OBJ. Непосредственно перед описанием внешней процедуры (функции) в тело основной программы вставляется директива компилятора

{$L <имя файла>}

  1. Использование встроенных машинных кодов в Паскале.

В Турбо Паскале имеется возможность непосредственного включения в программу небольших фрагментов, написанных на машинных кодах. Для этого используется стандартная директива INLINE, за которой в круглых скобках следует один или несколько элементов машинного кода, разделенных косыми чертами. Элемент кода, в свою очередь, строится из одного или более элементов данных, разделенных знаками "+" или "-". Операторы INLINE могут произвольным образом смешиваться с другими операторами Турбо Паскаля.

Значением идентификатора является смещение соответствующего объекта. Если переменная – глобальная, смещение задается относительно сегмента данных, хранящееся в регистре DS, если это локальная переменная, – относительно сегмента стека регистр SP). Базовым сегментом типизированной константы является сегмент кода регистр CS).

С помощью директивы INLINE можно также задавать последовательность машинных кодов, которую необходимо несколько раз вставить в программу. Для этого используется описание INLINE-процедуры, например:

Procedure DisableInterrupts;

inline ($FA); {CLI}

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

DisableInterrupt;

Компилятор вставит команду запрета прерываний CLI. Таким образом, INLINE-процедуры служат своеобразным средством расширения возможностей стандартного компилятора Турбо Паскаля и подобны макросам ассемблера. Использование INLINE-процедур увеличивает скорость исполнения программы, так как не осуществляется генерация (и исполнение) команд передачи управления в процедуру. По этой причине в INLINE-процедурах не следует использовать команды выхода из подпрограммы. INLINE-процедура может иметь параметры, однако на них нельзя ссылаться в INLINE-директивах (на другие символы Турбо Паскаля ссылаться можно).

В следующем примере перемножаются два числа типа INTEGER, результат имеет тип LONGINT:

FUNCTION LongMul(X,YInteger): Longint;

inline (

$5 А/ {POP AX; получить в АХ число Х }

$58/ { POP DX; получить в DX число Y }

$F7/$EA); { IMUL DX; DX:AX;= X * Y }

Отметим, что в силу упоминавшегося сходства с макросами ассемблера, имена INLINE-подпрограмм не могут использоваться в качестве аргументов в операторах @ или служить параметрами функций ADDROFS и SEG.

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

Работа оверлейных программ обеспечивается с помощью процедур и функций библиотечного модуля OVERLAY, входящего в библиотечный файл TURBO.TPL.

При создании оверлейных программ следет:

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

  • В главной части программы указать с помощью директив компилятора вида {$О <имя>} те модули, которые будут оверлейными, например:

Program Main;

Uses UnitA, UnitB;

{$0 UnitA}

{$O UnitB}

  • В начале главной программы и каждого оверлейного модуля необходимо поместить директивы компилятора {$О+} и {$F+}, после чего скомпилировать программу.

ovrinit(<имя файла>)

Инициализация оверлейного файла

ovrsetbuf(<длина>)

Установка размера буфера

ovrgetbuf

Возвращает размер текущего буфера