Руководство по языку B.Pascal 7

         

Операторы 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 могут свободно чередоваться с другими операторами.


Содержание раздела