Внешние процедуры (функции) в Паскале.
С помощью внешних процедур (функций) можно осуществить вызов из программы подпрограмм, написанных на языке ассемблера. Ассемблер обеспечивает компиляцию программ, написанных на машинно-ориентированном языке программирования низкого уровня, и обеспечивает более высокую скорость работы программы.
Внешняя процедура (функция) в программе, написанной на Турбо Паскале, объявляется своим заголовком, за которым следует стандартная директива EXTERNAL, например: Function Fun(a : byte); external;
Для подключения ассемблерной программы необходимо предварительно ее откомпилировать и получить объектный файл с расширением OBJ. Непосредственно перед описанием внешней процедуры (функции) в тело основной программы вставляется директива компилятора
{$L <имя файла>}
Использование встроенных машинных кодов в Паскале.
В Турбо Паскале имеется возможность непосредственного включения в программу небольших фрагментов, написанных на машинных кодах. Для этого используется стандартная директива 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-подпрограмм не могут использоваться в качестве аргументов в операторах @ или служить параметрами функций ADDR, OFS и SEG.
Оверлей в Паскале. Оверлей – это способ использования оперативной памяти, при котором в один и тот же участок памяти, называемый оверлейным буфером, в который попеременно, по мере надобности, загружаются различные оверлейные (перекрывающиеся) модули. При этом все оверлейные модули в готовом к работе виде хранятся на диске, а в оперативной памяти в каждый момент находится лишь один активный модуль. При этом максимальный занимаемый объем памяти равен сумме его главной части и наиболее длинного модуля.
Работа оверлейных программ обеспечивается с помощью процедур и функций библиотечного модуля OVERLAY, входящего в библиотечный файл TURBO.TPL.
При создании оверлейных программ следет:
Выделить главную часть программы и разбить оставшуюся часть на несколько модулей.
В главной части программы указать с помощью директив компилятора вида {$О <имя>} те модули, которые будут оверлейными, например:
Program Main;
Uses UnitA, UnitB;
{$0 UnitA}
{$O UnitB}
В начале главной программы и каждого оверлейного модуля необходимо поместить директивы компилятора {$О+} и {$F+}, после чего скомпилировать программу.
-
ovrinit(<имя файла>)
Инициализация оверлейного файла
ovrsetbuf(<длина>)
Установка размера буфера
ovrgetbuf
Возвращает размер текущего буфера