TURBO PASCAL

Новости

Программы   

Turbo Pascal 

Игры

Документация   

Странности

FAQ

Ссылки

Форум

Гостевая книга

Рассылка

Благодарности

Об авторе

 

 

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

Содержание

На первую страницу

Rambler's Top100 Rambler's Top100
PROext: Top 1000

(с)Все права защищены

По всем интересующим вопросам прошу писать на электронный адрес

Hosted by uCoz