TURBO PASCAL |
Новости
|
Операторы InlineОператор 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 могут свободно чередоваться с другими операторами. |
(с)Все права защищены По всем интересующим вопросам прошу писать на электронный адрес |