Оператор inline состоит из зарезервированного слова Inline,
за которым следует одна или более встроенных записей (записей ма-
шинного кода), разделенных косой чертой и заключенных в круглые
скобки:
inline(10/$2345/Count+1/Data-Offset);
Оператор inline имеет следующий синтаксис:
┌────────┐ ┌───┐ ┌──────────┐ ┌───┐
подставляемый ──>│ inline ├─>│ ( ├────>│ запись в ├─┬─>│ ) ├─>
оператор └────────┘ └───┘ ^ │ машинном │ │ └───┘
│ │ коде │ │
│ └──────────┘ │
│ ┌───┐ │
└──────┤ / │<────┘
└───┘
Каждый оператор inline состоит из необязательного специфика-
тора размера, < или >, и константы или идентификатора переменой,
за которой следуют ноль или более спецификаторов смещения (см.
описанный далее синтаксис). Спецификатор смещения состоит из +
или -, за которым следует константа.
┌───────────┐
запись во ──┬────────────────────>│ константа ├───────────────>
встроенном │ ┌───┐ ^ └───────────┘ ^
машинном ├──>│ < ├──────┤ │
коде │ └───┘ │ │
│ ┌───┐ │ │
├──>│ > ├──────┘ │
│ └───┘ │
│ ┌───────────────┐ │
└─>│ идентификатор ├─┬────────────────────┘
│ переменной │ │ ^
└───────────────┘ │ │
┌────┘ └─────────┐
│ ┌────┐ ┌─────────┐ │
└─────>│знак├──>│константа│──┬────┘
^ └────┘ └─────────┘ │
B.Pascal 7 & Objects/LR - 443 -
└─────────────────────────┘
Каждая запись 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 }
B.Pascal 7 & Objects/LR - 444 -
В операторной части блока операторы inline могут свободно
чередоваться с другими операторами.