Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
BorlandPascal.doc
Скачиваний:
54
Добавлен:
17.03.2015
Размер:
2.83 Mб
Скачать

Глава 25. Компоновка с программами на языке ассемблера

С помощью директивы компилятора $L можно выполнить компонов-

ку программ или модулей на языке Паскаль и процедур и функций на

языке ассемблера. Из исходного файла на языке ассемблера можно с

помощью ассемблера получить объектный файл (с расширением .OBJ).

Используя компоновщик, несколько объектных файлов можно скомпоно-

вать с программой или модулем. При этом используется директива

компилятора $L.

В программе или модуле на языке Паскаль процедуры или функ-

ции, написанные на языке ассемблера, должны быть описаны как

внешние. Например:

function LoCase(Ch : Char): Char; external;

В соответствующем файле на языке ассемблера все процедуры

или функции должны находиться в сегменте с именем CОDЕ или CSEG,

или в сегменте, имя которого заканчивается на _TEXT, а имена

внешних процедур и функций должны быть указаны в директивах

PUВLIC.

Вы должны обеспечить соответствие процедуры или функции ее

определению в Паскале. Это относится в типу ее вызова (ближний

или дальний), числу и типу параметров и типу результата.

В исходном файле на языке ассемблера могут описываться ини-

циализированные переменные, содержащиеся в сегменте с именем

CONST или в сегменте, оканчивающемся на _DAТA, и неинициализиро-

ванные переменные в сегменте с именем DATA или DSEG, или в сег-

менте, имя которого оканчивается на _BSS. В исходном файле на

языке ассемблера эти переменные являются частными, и на них нель-

зя ссылаться из модуля или программы на Паскале. Они, однако, на-

ходятся в том же сегменте, что и глобальные переменные Паскаля, и

доступны через регистр сегмента DS.

На все процедуры, функции и переменные, описанные в модуле

или программе на Паскале и на те из них, которые описаны в интер-

фейсной секции используемых модулей, можно ссылаться из исходного

файла на языке ассемблера с помощью директивы EXTRN. При этом

обязанность обеспечить корректный тип в определении EXTRN также

возлагается на вас.

Когда объектный файл указывается в директиве $L, Borland

Pascal преобразует файл из формата перемещаемых объектных модулей

(.OBJ) фирмы Intel в свой собственный внутренний формат перемеща-

емых модулей. Это преобразование возможно лишь при соблюдении не-

которых правил:

1. Все процедуры и функции должны быть помещены в сегмент с

именем CODЕ или CSEG, или в сегмент, имя которого окан-

чивается на _TEXT. Все инициализированные частные пере-

менные должны помещаться в сегмент с именем Const или в

сегмент, имя которого оканчивается на _DATA. Все неини-

циализированные частные переменные должны быть помещены

в сегмент, имя которого оканчивается на _DAТA. Неинициа-

лизированные локальные переменные должны помещаться в

сегмент с именем DATA или DSEG, или в сегмент, имя кото-

рого оканчивается на _BSS. Все другие сегменты игнориру-

ются, поэтому имеется директива GRОUР. В определениях

сегмента может задаваться выравнивание на границу слова

или байта (WORD или ВYTE). При компоновке они всегда вы-

равниваются на границу слова. В определениях сегментов

могут указываться директивы PUВLIС и имя класса (они иг-

норируются).

2. Borland Pascal игнорирует все данные для сегментов, от-

личных от сегмента кода (CODE, CSEG или xxxx_TEXT) и

инициализированного сегмента данных (CONST или

xxxx_DATA). Поэтому при описании переменных в сегменте

неинициализированных данных (DAТA, DSEG или xxxx_BSS)

для определения значения всегда используйте вопроситель-

ный знак (?). Например:

Count DW ?

Buffer DB 128 DUP(?)

3. Байтовые ссылки на идентификаторы типа EXTRN недопусти-

мы. Это означает, например, что операторы НIGНТ и LОW

нельзя использовать с идентификаторами типа EXTRN.

Соседние файлы в предмете Программирование на Pascal