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