TURBO PASCAL

Новости

Программы   

Turbo Pascal 

Игры

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

Странности

FAQ

Ссылки

Форум

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

Рассылка

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

Об авторе

 

 

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

Содержание

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

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

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

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

Hosted by uCoz