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