Компоновка с программами на языке ассемблера
С помощью директивы компилятора $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.