|
|
|
|
Определение типов операндов
В среде 8086/8088 существует четыре основных типа операндов. Это - регистровый операнд, непосредственный операнд, операнд памяти и адреса. Для
операндов, ориентированных на данные, возможны подтипы. Регистры представляют собой специальные случаи сумматоров (регистр общего назначения A) и
регистры сегментов. Все три типа данных могут подразделяться на 8- и 16-битовые данные. Адреса могут быть near (близкие, состоящие только из
смещения) или far (далекие, состоящие из смещения и сегмента).
Как мы будем различать все эти типы? Мы будем использовать операторы MASM .TYPE и TYPE. В Табл. 1-7 приведены результаты использования этих
операторов с различными классами операндов.
Таблица 1-7. Операторы MASM .TYPE и TYPE
Правила для .TYPE и TYPE
---------------------------------------------------------
Оператор Результат
---------------------------------------------------------
.TYPE биты 5 и 7 8х Определено внешне
2х Определено локально
0х Неверная ссылка
.TYPE биты 0 ... 2 х0 Абсолютный режим
х1 Программозависимый
х2 Зависимый по данным
TYPE с переменной 01 Переменная в байт
02 Переменная в слово
04 Переменная в двойное
слово
08 Переменная в четверное
слово
10 Переменная в 10 байтов
ХХ Структура размерностью
в ХХ
TYPE с программной меткой FFFF "Близкая" программная
метка
FFFE "Далекая" программная
метка
-------------------------------------------------------------
Примеры для .TYPE и TYPE
-------------------------------------------------------------
Тип переменной .TYPE Определено TYPE Определено
-------------------------------------------------------------
Непосредственный 20 локально 0 неверно
Регистровый 20 локально 0 неверно
Метка данных 22 локально Х количество
байтов
"Близкая" метка 21 локально FFFF "близкая"
метка
"Далекая" метка 21 локально FFFE "далекая"
метка
Код операции MASM 00 неверно 0 неверно
Нонсенс 00 неверно 0 неверно
-------------------------------------------------------------
|
Список примеров можно продолжить. Хотя .TYPE и распознает имена различных регистров, он не распознает регистровые конструкции типа [BX] или
ARRAY[BX][SI]. Односимвольная константа типа A распознается оператором .TYPE как переменная, определенная локально.
Во время первого прохода ассемблера ссылка вперед никак нераспознается. IFDEF в качестве результата возвращает "не определенно", .TYPE
возвращает "неверно", а TYPE возвращает нулевую длину. К ссылкам вперед может быть применено только одно правило: если возможно, не применять их
вообще.
|
|