Руководство по языку B.Pascal 7

       

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


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

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

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

встроенный ассемблер проверяет, что размер QuitFlag равен 1 (байт), а размер 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 ---------------------T--------------------------------- ¦ Идентификатор ¦ Тип ¦ +--------------------+---------------------------------+ ¦ BYTE ¦ 1 ¦ ¦ WORD ¦ 2 ¦ ¦ DWORD ¦ 4 ¦ ¦ QWORD ¦ 8 ¦ ¦ TBYTE ¦ 10 ¦ ¦ NEAR ¦ 0FFFEH ¦ ¦ FAR ¦ 0FFFFH ¦ L--------------------+----------------------------------

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

procedure FarProc; far;

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

asm push cs call NEAR PTR FarProc end



Содержание раздела