Флаг направления
Флаг направления
Последним флагом в регистре флагов является флаг направления DF.
Набор команд микропроцессора 8088 содержит несколько команд
обработки строк, которые работают с большими блоками данных. Эти
команды обработывают блоки данных побайтно или по одному слову
памяти за раз. Индексные регистры указывают на блоки данных. После
обработки байта или слова процессор изменяет индексный регистр так,
чтобы он указывал на следующий элемент блока.
Строковые операции используют флаг направления для определения
направления продвижения по блоку данных. Если флаг направления
сброшен в 0, команды обработки строк увеличивают значение
индексного регистра, а если флаг направления установлен в 1, то они
уменьшают это значение. Флаг направления позволяет одному набору
строковых команд обслуживать оба направления в зависимости от
установки флага. В некоторых случаях желательно пересылать строку с
увеличением адресов, а в других лучше всего использовать уменьшение
адреса.
В качестве примера предположим, что в программе используется
команда пересылки строк для пересылки блока данных на новое место.
Если программа пересылает блок, с большего адреса памяти на
меньший, она сбрасывает флаг направления, чтобы увеличивать
значения индексных регистров после каждой пересылки; если же
пересылка производится на больший адрес памяти, флаг направления
устанавливается в 1, показывая уменьшение индексных регистров. В
случае большинства пересылок не имеет значения, как именно
установлен этот флаг. Но если конечное положение блока перекрывает
его начальное положение, а флаг направления уствновлен неверно, то
информация в блоке будет во время пересылки испорчена.
Рисунок 3.16 иллюстрирует пример пересылки блоков. Исходный
блок данных имеет длину 200H байт и расположен от 300H до 4FFH.
Нужно переслать его на новое место, расположив от 400H до 5FFH;
исходное и результирующее поля перекрываются.
300 ГДДДДДДДДДДДЕДДД Указатель 300 ГДДДДДДДДДДДґ
і і источника і і
і і SI і і
і і і і
Источник 400 ГДДДДДДДДДДДЕДДД Указатель 400 ГДДДДДДДДДДДґ
і і назначения і і
і і DI і і
і і і і
Назначение 500 ГДДДДДДДДДДДґ 500 ГДДДДДДДДДДДґ<-- Указатель
і і і і источника
і і і і
і і і і
600 ГДДДДДДДДДДДґ 600 ГДДДДДДДДДДДґ<-- Указатель
Фиг. 3.16 Флаг направления
В примере на Фиг.3.16(а) указатели источника и результата
установлены на начала соответствующих блоков: указатель источника
на 300H, а указатель результата на 400H. Флаг направления в примере
сброшен, так, чтобы указатели увеличивались после каждой пересылки.
Как показано на рисунке, после пересылки с помощью строковой
операции 100H байт, указатель источника переместится на блок
результата, а эта область блока уже заполнена данными после
пересылки. Пересылка последних 100H байт будет неправильной, так
как потеряны исходные данные блока.
В части (b) примера указатели и источника, и результата
установлены на концы блоков. Флаг направления установлен так, что
содержимое указателей уменьшается после пересылки. При таком
способе данные пересылаются верно.
Программы ввода-вывода для IBM PC дают характерный пример
использования флага направления для перемещения изображения на
экране дисплея. Программа ввода-вывода использует команды пересылки
строк микропроцессора 8088 для пересылки данных внутри буфера
дисплея. Когда программа передвигает изображение на экране вверх,
команды пересылают данные в меньшие адреса памяти. Когда программа
опускает символы на экране вниз, команды пересылают данные в
большие адреса памяти. В каждом случае программа устанавливает или
сбрасывает флаг направления в соответствии с направлением
пересылаемых данных.