TURBO PASCAL

Новости

Программы   

Turbo Pascal 

Игры

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

Странности

FAQ

Ссылки

Форум

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

Рассылка

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

Об авторе

 

 

Типы выражений 

             Каждое выражение встроенного ассемблера имеет  соответствую-
        щий тип,  или, если говорить точнее, размер, поскольку встроенный
        Ассемблер рассматривает тип выражения просто как его размер в па-
        мяти.  Например, тип (размер) переменной Integer равен 2, так как
        она занимает два байта.

             Там, где это возможно,  встроенный ассемблер выполняет  про-
        верку типов, поэтому в инструкциях:

             var
               QuitFlag: Boolean;
               OutBufPtr: Word;
                .
                .
                .
             asm
               mov       al,QuitFlag
               mov       bx,OutBufPtr
             end;

        встроенный ассемблер проверяет,  что  размер  QuitFlag  равен   1

         B.Pascal 7 & Objects/LR     - 428 -

        (байт), а размер OutBufPtr - двум (слово). Если проверка типа об-
        наруживает несоответствие,  возникает ошибка. Например, следующее
        недопустимо:

             asm
               mov     dl,OutBufPtr
             end;

        так как DL - это байтовый регистр, а OutBufPtr - слово. Тип ссыл-
        ки на память можно изменить с помощью назначения типа. Корректным
        способом записи предыдущих инструкций будет следующий:

             asm
               mov     dl,BYTE PTR OutBufPtr
               mov     dl,Byte(OutBufPtr)
               mov     dl,OutBufPtr.Byte
             end;

             Все эти инструкции ссылаются на первый (менее значащий) байт
        переменной OutBufPtr.

             В некоторых случаях ссылка на память является нетипизирован-
        ной,  то  есть не имеет соответствующего типа.  Приведем пример с
        непосредственным значением, заключенным в квадратные скобки:

             asm
               mov     al,[100H]
               mov     bx,[100H]
             end;

             Встроенный ассемблер  допускает обе этих функции,  поскольку
        выражение [100H] не имеет соответствующего типа, оно просто озна-
        чает  "содержимое по адресу 100H в сегменте данных",  а тип можно
        определить из первого операнда (байт для AL, слово для BX). В том
        случае, когда тип нельзя определить из другого операнда, встроен-
        ный ассемблер требует явного назначения типа:

             asm
               mov     BYTE PTR [100H]
               mov     WORD PTR [100H]
             end;

             В Таблице 24.4 приведены предопределенные идентификаторы ти-
        па,  которые предусмотрены во встроенном ассемблере дополнительно
        к типам, описанным в Паскале:

                  Предопределенные идентификаторы типа   Таблица 24.4
             ┌────────────────────┬─────────────────────────────────┐
             │  Идентификатор     │         Тип                     │
             ├────────────────────┼─────────────────────────────────┤
             │  BYTE              │         1                       │
             │  WORD              │         2                       │
             │  DWORD             │         4                       │
             │  QWORD             │         8                       │
             │  TBYTE             │         10                      │
             │  NEAR              │         0FFFEH                  │
             │  FAR               │         0FFFFH                  │
             └────────────────────┴─────────────────────────────────┘

             Заметим в частности,  что NEAR и FAR - это псевдотипы, кото-
        рые используются с идентификаторами процедур и функций для указа-
        ния их модели вызова. Вы можете использовать назначения типа NEAR
        и FAR аналогично другим идентификаторам. Например, если FarProc -
        процедура с дальним типом вызова (FAR):

             procedure FarProc; far;

        и если вы записываете код встроенного ассемблера в том же модуле,
        где  находится  FarProc,  то вы можете использовать для ее вызова
        более эффективную инструкцию NEAR:

             asm
               push      cs
               call      NEAR PTR FarProc
             end

Содержание

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

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

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

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

Hosted by uCoz