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

Методы на языке ассемблера

Методы, реализованные на языке ассемблера, можно скомпоно-

вать с программами Borland Pascal с помощью директивы компилятора

$L и зарезервированного ключевого слова external. Описание внеш-

него метода в объектном типе не отличается от обычного метода;

однако в реализации метода перечисляется только заголовок метода,

за которым следует зарезервированной слово external. В исходном

тексте на ассемблере вместо точки (.) для записи уточненных иден-

тификаторов следует использовать операцию @ (точка в ассемблере

уже имеет другой смысл и не может быть частью идентификатора).

Например, идентификатор Паскаля Rect.Init записывается на ассемб-

лере как Rest@Init. Синтаксис @ можно использовать как в иденти-

фикаторах PUBLIC, так и EXTRN.

Включаемый машинный код

Для небольших подпрограмм на языке ассемблера очень удобно

использовать внутренние директивы и операторы Borland Pascal

(операторы inline). Они позволяют вставлять инструкции машинного

кода непосредственно в программу или текст блока, вместо того,

чтобы использовать объектный файл.

Операторы Inline

Оператор inline состоит из зарезервированного слова Inline,

за которым следует одна или более встроенных записей (записей ма-

шинного кода), разделенных косой чертой и заключенных в круглые

скобки:

inline(10/$2345/Count+1/Data-Offset);

Оператор inline имеет следующий синтаксис:

--------- ---- ----------- ----

подставляемый -->¦ inline +->¦ ( +---->¦ запись в +-T->¦ ) +->

оператор L--------- L---- ^ ¦ машинном ¦ ¦ L----

¦ ¦ коде ¦ ¦

¦ L----------- ¦

¦ ---- ¦

L------+ / ¦<-----

L----

Каждый оператор inline состоит из необязательного специфика-

тора размера, < или >, и константы или идентификатора переменой,

за которой следуют ноль или более спецификаторов смещения (см.

описанный далее синтаксис). Спецификатор смещения состоит из +

или -, за которым следует константа.

------------

запись во --T-------------------->¦ константа +--------------->

встроенном ¦ ---- ^ L------------ ^

машинном +-->¦ < +------+ ¦

коде ¦ L---- ¦ ¦

¦ ---- ¦ ¦

+-->¦ > +------- ¦

¦ L---- ¦

¦ ---------------- ¦

L->¦ идентификатор +-T---------------------

¦ переменной ¦ ¦ ^

L---------------- ¦ ¦

------ L---------

¦ ----- ---------- ¦

L----->¦знак+-->¦константа¦--T-----

^ L----- L---------- ¦

L--------------------------

Каждая запись inline порождает 1 байт или одно слово кода.

Значения вычисляется, исходя из значения первой константы или

смещения идентификатора переменной, к которому добавляется или из

которого вычитается значение каждой из последующих констант.

Если запись в машинном коде состоит только из констант и,

если ее значение лежит в 8-битовом диапазоне (0..255), то она по-

рождает один байт кода. Если значение выходит за границу 8-бито-

вого диапазона или если запись inline ссылается на переменную, то

генерируется одно слово кода (младший байт следует первым).

Операции < и > могут использоваться для отмены автоматичес-

кого выбора размера, который был описан ранее. Если оператор

inline начинается с операции <, то в код включается только млад-

ший значащий байт значения, даже если это 16-битовое значение.

Если оператор inline начинается с операции >, то в код включается

всегда слово, даже если старший значащий байт равен 0. Например,

оператор:

inline(<$1234/>$44);

гененирует код длиной три байта: $34,$44,$00.

Значение идентификатора переменной в записи inline представ-

ляет собой адрес смещения переменной внутри ее базового сегмента.

Базовый сегмент глобальных переменных (переменных, описанных на

самом внешнем уровне в модуле или программе) и типизованные конс-

танты, доступ к которым организован через регистр DS, представля-

ют собой сегмент данных. Базовый сегмент локальных переменных

(переменных, описанных внутри подпрограммы) является сегментом

стека. В этом случае смещение переменной относится к регистру ВР,

что автоматически влечет за собой выбор сегмента стека.

Примечание: Регистры BP, SP, SS и DS должны сохранять-

ся с помощью операторов inline. Значение всех других ре-

гистров можно изменять.

В следующем примере оператора inline генерируется машинный

код для записи заданного числа слов или данных в указанную пере-

менную. При вызове процедуры FillWord Count слов со значением

Data записывается в памяти, начиная с первого байта, обозначенно-

го как Dest.

procedure FillWord(var Dest, Count, Data: word);

begin

inline(

$C4/$BE/Dest/ { LES DI,Dest[BP] }

$8B/$8e/Count/ { MOV CX,Xount[BP] }

$8B/$86/Data/ { MOV AX,Data[BP] }

$FC/ { CLD }

$F3/$AB); { REP STOSW }

В операторной части блока операторы inline могут свободно

чередоваться с другими операторами.

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