Дополнительные возможности обработки
Понимая важность типа данных «запись» для эффективного программирования,
разработчики транслятора TASM, начиная с версии 3.0, включили в систему его
команд две дополнительные команды на правах директив. Последнее означает, что
эти команды внешне имеют формат обычных команд ассемблера, но после транс-
ляции они приводятся к одной или нескольким машинным командам. Введение
этих команд в язык
повышает наглядность работы с записями, оптимизи-
рует код и уменьшает размер программы. Эти команды позволяют скрыть от про-
граммиста действия по выделению и установке отдельных полей записи (см. ранее).
Для установки значения некоторого поля записи используется команда SETFIELD
с синтаксисом:
s e t f i e l d имя_элемента_записи
Для выборки значения некоторого поля записи используется команда GETFIELD
с синтаксисом:
g e t f i e l d имя_элемента_записи
Работа команды SETFIELD заключается в следующем. Местоположение записи
определяется операндом приемник, который может представлять собой имя регис-
тра или адрес памяти. Операнд
определяет элемент записи,
с которым ведется работа (по сути, если вы были внимательны, он определяет сме-
щение элемента в записи относительно младшего разряда). Новое значение, в ко-
Записи 291
торое необходимо установить указанный элемент записи, должно содержаться
в операнде регистр_источник. Обрабатывая данную команду, транслятор генериру-
ет последовательность команд, которые выполняют следующие действия.
1. Сдвиг содержимого операнда регистр_источник влево на количество разрядов,
соответствующее расположению элемента в записи.
2. Выполнение логической операции OR над операндами п р и е м н и к и регистр_ис-
точник. Результат операции помещается в операнд приемник.
Важно отметить, что SETFIELD не производит предварительной очистки элемен-
та, в результате после логического сложения командой OR возможно наложение
старого содержимого элемента и нового устанавливаемого значения. Поэтому тре-
буется предварительно подготовить поле в записи путем его обнуления.
Действие команды GETFIELD обратно действию SETFIELD. В качестве операнда
источник может быть указан либо регистр, либо адрес памяти. В регистр, указан-
ный операндом регистр_приемник, помещается результат работы команды — значе-
ние элемента записи. Интересная особенность связана с операндом регистр_прием-
ник. Команда GETFIELD всегда использует 16-разрядный регистр, даже если вы
укажете в этой команде имя 8-разрядного регистра.
В качестве примера применения команд SETFIELD и GETFIELD рассмотрим лис-
тинг 13.8.
Листинг
Работа с полями записи
model small
stack 256
record
flag iotest <>
main:
mov
mov bl,3
setfield
xor
g e t f i e l d
mov
, 1
s e t f i e l d
s e t f i e l d
exi
mov
выход
int 21h
end main ;конец программы
В листинге 13.8 демонстрируется порядок извлечения и установки некоторых
полей записи. Результат работы команд SETFIELD и GETFIELD удобнее всего изучать
в отладчике. При установке значений полей не производится их предварительная
очистка. Это сделано специально. Для такого рода операций лучше использовать
некоторые универсальные механизмы, иначе велик риск внесения ошибок, кото-
рые трудно обнаружить и исправить. В качестве такого механизма можно предло-
жить макрокоманды, к рассмотрению которых мы и приступим в следующей главе.
292 Глава
Сложные структуры данных
В заключение хотелось бы привести еще один пример использования записей.
Это описание регистра EFLAGS. Для удобства мы разбили описание на три части:
eflags_l_7 — младший байт регистра EFLAGS/FLAGS;
я
— второй байт регистра EFLAGS/FLAGS;
т eflags_h — старшая половина регистра EFLAGS.
record
record
record
К этому описанию стоит вернуться после изучения материала следующей гла-
вы, посвященного макрокомандам. Возможно, что для работы с регистром флагов
вам захочется разработать соответствующую макрокоманду. Подобная хорошо
протестированная макрокоманда в будущем поможет вам избежать многих труд-
но обнаруживаемых ошибок.
Итоги
9 TASM поддерживает несколько дополнительных типов данных, значительно
расширяющих возможности базовых директив резервирования и инициализа-
ции данных. По сути, эти типы заимствованы из языков высокого уровня и при-
званы облегчить разработку прикладных программ на ассемблере.
- Практическое использование дополнительных типов данных требует повышен-
ного внимания и отражает специфику программирования на языке ассемблера.
Понятия массива и индексации массива весьма условны, и логическая интер-
претация области памяти, отведенной под массив, определяется алгоритмом
обработки.
Тип структуры в языке ассемблера позволяет создать совокупность логически
взаимосвязанных разнотипных данных и рассматривать их как отдельный
объект. Это очень удобно, когда в программе необходимо иметь несколько та-
ких объектов. В этом случае обычно организуют массив структур.
is Основное достоинство объединений — в возможности «плюрализма суждений»
о типе одной и той же области памяти.
в Записи в языке ассемблера расширяют возможности логических команд для
работы на уровне битов, что подчеркивает значение ассемблера как языка сис-
темного программирования.
Do'stlaringiz bilan baham: |