Глава 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.