Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
lec_asm_06_3495.doc
Скачиваний:
2
Добавлен:
01.04.2025
Размер:
178.18 Кб
Скачать

5.4. Команды управления циклами

Команды управления циклами обеспечивают условные передачи управления при организации циклов. У микропроцессора 8088 регистр счетчика СХ служит счетчиком числа повторений циклов. Каждая команда управления циклами уменьшает содержимое регистра СХ на 1, а затем использует его новое значение для "принятия решения" о выполнении или не выполнении перехода.

Основная команда этой группы LOOP (повторять цикл до конца счетчика) имеет формат

LOOP близкая_метка

Она уменьшает содержимое регистра СХ на 1 и передает управление операнду близкая_метка, если содержимое регистра СХ не равно 0. Например, для стократного выполнения определенной группы команд можно воспользоваться следующей конструкцией:

MOV СХ, 100 ; Загрузить число повторений в СХ

START: ... ; Повторяемая группа команд

LOOP START ; Если СХ не равен 0, перейти к метке START,

; в противном случае выйти из цикла

Команда LOOP завершает выполнение цикла только в том случае, если содер­жимое регистра СХ уменьшено до 0. Однако во многих приложениях требуются такие циклы, которые должны завершаться при выполнении определенных условий до того, как содержимое регистра СХ достигнет нуля. Такое альтернатив­ное завершение цикла обеспечивается командой LOOPE (повто­рять цикл, если равно), имеющей синоним LOOPZ (повторять цикл, если нуль), и командой LOOPNE (повторять цикл, если не равно), имеющей синоним LOOPNZ (повторять цикл, пока не нуль).

Команда LOOPE:

– уменьшает содержимое регистра СХ на 1,

–осуществляет переход, если содержимое регистра СХ не равно 0 и флаг нуля ZF равен 1.

Таким образом, повторение цикла завершается, если:

– либо содержимое регистра СХ равно 0,

– либо флаг ZF равен 0,

– либо оба они равны 0.

Обычно команда LOOPE используется для поиска первого ненулевого результата в серии операций.

Команда LOOPNE:

– уменьшает содержимое регистра СХ на 1,

– осуществляет переход, если содержимое регистра СХ не равно 0 и флаг нуля ZF равен 0.

Таким образом, повторение цикла завершается, если:

– либо содержимое регистра СХ равно 0,

– либо флаг ZF равен 1,

– либо будет выполнено и то, и другое.

Обычно команда LOOPNE используется для поиска первого нулевого результата в серии операций.

Пример. В регистре ВХ содержится адрес начала таблицы байтов.

NEXT: INC ВХ ; Передвинуть указатель к следующей

СМР [ ВХ ], 0 ; ячейке и сравнить ее с 0

LOOPE NEXT ; Перейти к сравнению следующего

; байта

JNZ NZ ; Найден ненулевой байт

... ; Нет.

NZ: ... ; Да.

INC – команда увеличения на единицу.

6. Команды обработки строк

Команды обработки строк позволяют производить действия над блоками байтов или слов памяти. Эти блоки (или строки) могут иметь длину до 64 Кбайт и состоять из числовых или алфавитно-цифровых значений (типа символов в кодах ASCII).

Команды обработки строк предоставляют возможность выполнения пяти основ­ных операций, называемых примитивами, которые обрабатывают строку по одному элементу (байту или слову) за прием.

Микропроцессор 8088 предполагает, что строка-приемник находится в дополни­тельном сегменте, а строка-источник – в сегменте данных. Процессор адресует строку-приемник через регистр DI, а строку-источник – через регистр SI.

Перед выполнением команд необходимо обеспечить, чтобы эти регистры содержали смещение первых обрабатываемых элементов обеих строк относительно начала соответствующего сегмента.

Это можно сделать с помощью команды LEA (загрузить исполнительный адрес). Команда LEA пересылает смещение ячейки памяти в любой 16-битовый регистр общего назначе­ния, регистр указателя или индексный регистр. Она имеет формат

LEA регистр, память

Пример. Если в сегменте данных описана строка SOURCE, а в дополнительном сегменте – строка DEST, то необходимы действия

LEA SI, SOURCE

LEA DI, DEST

Возможно ли, чтобы обе обрабатываемые строки находились в одном сегменте: сегменте данных или в дополнительном сегменте?

Это возможно, но необходимо задать корректные значения сегментных регистров ES и DS.

Если обе строки находятся в сегменте данных, то необходимо в регистр ES поместить адрес начала сегмента данных, т.е. значение, находящееся в регистре DS. Тогда процессор будет думать, что он обращается к дополнительному сегменту, а на самом деле будет обращаться к сегменту данных.

Пример. Строки SOURCE и DEST находятся в сегмен­те данных.

PUSH DS ; Заставить ES указывать на сегмент

POP ES ; данных

Аналогично, если же обе строки находятся в дополнительном сегменте, то необходимо в регистр DS поместить адрес начала дополнительного сегмента, т.е. значение, находящееся в регистре ES.

Так как команды манипулирования строками предназначены для действий над группой элементов, то они автоматически модифицируют указатели для адреса­ции следующего элемента строки.

Бит флага направления DF в регистре флагов опреде­ляет, будут значения регистров SI и DI увеличены или уменьшены по завершении выполнения команды. Если флаг DF равен 0, то значения регистров SI и DI увеличиваются после исполнения каждой команды. Если флаг DF равен 1, то они уменьшаются.

Состоянием флага DF можно управлять с помощью двух команд: CLD – сбросить флаг направления, которая полагает его равным нулю, и STD – установить флаг направления, которая присваивает ему значение 1.

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]