<<
>>

Организация циклов

Цикл, как известно, представляет собой важную алгоритмическую структуру, без которой не обходится, наверное, ни одна программа. Организовать циклическое выполнение некоторого фрагмента программы можно, к примеру, используя ко- манды условной передачи управления или команду безусловного перехода JMP.
Например, подсчитаем количество нулевых байтов в области mas (листинг 10.2). Листинг 10,2. Подсчет числа нулевых элементов продолжение &
Листинг 10.2 (продолжение)

Цикл в листинге 10.2 организован тремя командами, JCXZ, DEC и JMP (строки 15, 21 и 22). Команда JCXZ выполняет здесь две функции: предотвращает выполнение «пустого» цикла (когда счетчик цикла в СХ равен нулю) и отслеживает окончание цикла после обработки всех элементов поля mas. Команда DEC после каждой итера- ции цикла уменьшает значение счетчика в регистре СХ на 1. Заметьте, что при та- кой организации цикла все операции по его организации выполняются «вручную». Но, учитывая важность такого алгоритмического элемента, как цикл, разработчи- ки процессора ввели в систему команд группу из трех команд, облегчающую про- граммирование циклов. Эти команды также используют регистр ЕСХ/СХ как счет- чик цикла. Дадим краткую характеристику этим командам. Команда LOOP позволяет организовать циклы (loops), подобные циклам for в языках высокого уровня с автоматическим уменьшением счетчика цикла. Син- таксис команды: loop метка_перехода Команда реализует описанные далее действия. 1. Декремент регистра ЕСХ/СХ. 2. Сравнение регистра ЕСХ/СХ с нулем: П если (ЕСХ/СХ) > 0, то управление передается на метку перехода; П если (ЕСХ/СХ) = 0, то управление передается на следующую после LOOP ко- манду.

Команды LOOPE и LOOPZ (Loop still сх 0 or Zero flag = 0 — повторить цикл пока СХ 0 или ZF = 0) — абсолютные синонимы, поэтому используйте ту команду, ко- торая вам больше нравится. Синтаксис команд: lооре/lоорz метка_перехода Команды реализуют описанные далее действия. 1. Декремент регистра ЕСХ/СХ. 2. Сравнение регистра ЕСХ/СХ с нулем и анализ состояния флага нуля ZF: П если (ЕСХ/СХ) > 0 и ZF = 1, управление передается на метку перехода; D если(ЕСХ/СХ) = 0 или ZF=О, управление передается на следующую после ШОР команду. Команды LOOPNE и LOOPNZ (Loop still сх 0 or NonZero flag = 0 — повторить цикл, пока СХ 0 или ZF= 1) также абсолютные синонимы. Синтаксис команд: loopne/loopnz метка_перехода Команды реализуют описанные далее действия. 1. Декремент регистра ЕСХ/СХ. 2. Сравнение регистра ЕСХ/СХ с нулем и анализ состояния флага нуля ZF: ? если (ЕСХ/СХ) > 0 и ZF = 0, управление передается на метку перехода; ? если (ЕСХ/СХ) = 0 или ZF = 1, управление передается на следующую после LOOP команду. Команды LООРЕ/LООРZ и LOOPNE/LOOPNZ по принципу своей работы являются взаимнообратными. Они расширяют действие команды ШОР тем, что дополнитель- но анализируют флаг ZF. Это дает возможность организовать досрочный выход из цикла, используя этот флаг в качестве индикатора. Типичное применение этих команд связано с операцией поиска определенного значения в последовательно- сти или со сравнением двух чисел. Недостаток команд организации цикла LOOP, LOOPE/LOOPZ и LOOPNE/LOOPNZ за- ключается в том, что они реализуют только короткие переходы (от -128 до + 127 байт). Для работы с длинными циклами придется использовать команды условного перехода и команду JМР (см. листинг 10.2), поэтому постарайтесь осво- ить оба способа организации циклов. Рассмотрим несколько примеров организа- ции циклов с помощью команд LOOP, LOOPE/LOOPZ и LOOPNE/LOOPNZ. Программа из листинга 10.2 с использованием команды организации цикла будет выглядеть так, как показано в листинге 10.3.
Листинг 10.3 (продолжение) mоv ах,4с0θh i n t 21h ;возврат управления операционной системе end start Заметьте, что у команды JСХZ в строке 14 осталась только одна функция — не допустить выполнения «пустого» цикла, поэтому несколько изменилось ее место в тексте программы: теперь она стоит перед меткой начала цикла сусl. Изменение и контроль содержимого регистра СХ в процессе выполнения каждой итерации вы- полняет команда ШОР (строка 21). Рассмотрим пример, в котором продемонстрируем типичный подход к исполь- зованию команды LOOPNZ. В программе из листинга 10.4 ищется первый нулевой элемент в поле mas. Интерес представляют строки 20 и 21. Команда LOOPNZ на ос- новании содержимого регистра СХ и флага ZF принимает решение о продолжении цикла. Выход из цикла происходит в одном из двух случаев: СХ = 0 (просмотрены все элементы поля mas) или ZF = 1 (командой СМР обнаружен нулевой элемент). Назначение следующей команды JZ (строка 21) в том, чтобы распознать конкрет- ную причину выхода из цикла. Если выход из цикла произошел после просмотра строки, в которой нет нулевых элементов, то флаг JZ не сработает и будет выдано сообщение об отсутствии нулевых элементов в строке (строки 7, 23-25). Если вы- ход из цикла произошел в результате обнаружения нулевого элемента, то в регис- тре SI окажется номер позиции этого элемента в поле mas и при необходимости можно продолжить обработку. В нашем случае мы просто завершаем программу — переходим на метку exit.
Листинг 10.4. Пример использования команды loopnz

Читатели, имеющие даже небольшой опыт программирования на языках высо- кого уровня, знают, что очень часто возникает необходимость во вложенных цик- лах.

Самый простой пример — обработка двухмерного массива. Работу с массива- ми, в том числе двухмерными, мы рассмотрим в главе 13, пока же разберемся с основными принципами организации вложенных циклов. Основная проблема, которая при этом возникает, — как сохранить значения счетчиков в регистре ЕСХ/ СХ для каждого из циклов. Для временного сохранения счетчика внешнего цикла на время выполнения внутреннего доступно несколько способов: задействовать регистры, ячейки памяти или стек. В следующем фрагменте программы имеется три цикла, вложенные один в другой. Этот фрагмент можно рассматривать как шаблон для построения других программ с вложенными циклами.
В качестве примера рассмотрим фрагмент программы, которая обрабатывает специальным образом некоторую область памяти (листинг 10.5). Область памяти рассматривается как совокупность пяти полей, содержащих 10 однобайтовых эле- ментов. Требуется заменить все нулевые байты в этой области значением Оffh.

<< | >>
Источник: В. И. Юров. Assembler. Учебник для вузов. 2-е изд. 2003

Еще по теме Организация циклов:

  1. Наложение циклов
  2. Наложение циклов
  3. 34. Социальная организация как вид социальной системы. Типы социальных организаций
  4. ОРГАНИЗАЦИЯ
  5. ОРГАНИЗАЦИЯ ФОРМАЛЬНАЯ
  6. § 12.2. Гибкая организация
  7. ОРГАНИЗАЦИЯ ПРЕГЕНИТАЛЬНАЯ
  8. 35. Элементы организации
  9. § 3.2. Цели организации
  10. § 3.7. Персонал организации
  11. § 5.3. Бюрократия в организациях
  12. Функции управления в организации.