Инструменты пользователя

Инструменты сайта


examination:asm:question17

Вопрос №17. Способы программирования циклов на ЯА. Примеры

Итерационные конструкции — циклы

Последней управляющей конструкцией, которую мы рассмотрим, будет итерация, или цикл. Циклом называется многократное повторение последовательности команд до наступления указанного условия.

В языках программирования высокого уровня известно много разновидностей циклов, в том числе:

цикл со счетчиком (цикл FOR), повторяющийся заранее заданное количество раз;

цикл с условием (цикл WHILE), повторяющийся до тех пор, пока условие истинно;

цикл с инверсным условием (цикл UNTIL), повторяющийся до тех пор, пока условие не станет истинным.

Цикл со счетчиком

В нашем примере тело цикла должно повторяться 10 раз. Сначала мы инициализируем счетчик. Затем выполняем тело цикла (в нашем случае пустое), после этого увеличиваем счетчик на 1. Проверяем: если счетчик меньше 10, то начинаем опять выполнять тело цикла, если же счетчик равен 10, то мы выходим из цикла.

for_start:

mov есх,0 ; инициализируем счетчик ЕСХ

for_loop: ;метка для перехода назад

. . . ;тело цикла

inc есх ;увеличиваем ЕСХ на 1

стр есх, 10 ;сравниваем ЕСХ с 10

jnz for_loop ; если не равно, переход на fоr_1оор

for _ finish ;если ЕСХ = 10, выходим

В нашем примере тело цикла должно повторяться 10 раз. Сначала мы инициализируем счетчик. Затем выполняем тело цикла (в нашем случае пустое), после этого увеличиваем счетчик на 1. Проверяем: если счетчик меньше 10, то начинаем опять выполнять тело цикла, если же счетчик равен 10, то мы выходим из цикла.

Рассмотрим другую версию цикла FOR. Она работает так же, как предыдущая, но счетчик мы будем хранить не в регистре, а в памяти, в переменной I.

for _ start :

mov dword [i],0 ;переменная типа dword I = 0

for_loop: ;метка для перехода назад

… ;тело цикла

inc dword [i] ;увеличиваем i на 1

cmp dword [1],10 ; сравниваем i с 10

jnz for__loop ;если не равно, переход на for_loop

for_finish: ;если равно, выходим

Вторая версия будет работать медленнее, поскольку счетчик хранится впамяти, время доступа к которой существенно больше, чем время доступа к регистрам.

В заключение давайте рассмотрим еще одну версию цикла, использующую команду DEC и команду проверки флага ZF вместо команды сравнения СМР.

Принцип работы следующий: устанавливаем счетчик (ЕСХ=10), выполняем тело цикла, уменьшаем счетчик на 1. Если ZF установлен, значит, в ЕСХ находится 0 и нам нужно прекратить выполнение цикла:

for_start:

mov есх,10 ;ЕСХ =10

fог_1оор: ;метка для перехода назад

… ;тело цикла

dec есх ;уменьшаем ЕСХ на 1

jnz for_loop ; если не О, переходим на for_loop

f o r _ f i n i s h : ;если О, выходим из цикла

Для организации цикла можно также использовать команду LOOP.

Перепишем наш простой цикл FOR с использованием команды LOOP:

for _ start :

mov сх,10 ;СХ = 10 — 10 итераций for_loop: ;метка для возврата назад

… ;тело цикла

loop for_loop ;уменьшаем СХ, если не 0, переходим к for_loop

for_finish: ;выход из цикла

Как видите, код стал еще более компактным.

Цикл со счетчиком и дополнительным условием.Команды LOOPZ и LOOPNZ

Команда LOOPZ позволяет организовать цикл с проверкой дополнительного условия. Например, мы можем уточнить условие из предыдущего примера: цикл нужно выполнить, как и раньше, не более 10 раз, но только при условии, что регистр ВХ содержит значение 3. Как только значение в регистре ВХ изменится, цикл нужно прервать.

Команда LOOPZ уточняет условие перехода следующим образом: переходьна указанную метку произойдет, если СХ не содержит нуля и в то же время флаг ZF равен единице. Другое имя этой команды — LOOPE.

Следующий фрагмент кода показывает пример цикла с дополнительным условием:

for_start:

mov СХ,10 ; СХ =10

for_loop: ; метка для возврата назад

… ;тело цикла FOR

… ;где-то здесь изменяется регистр ВХ

cmp bх,3 ; ВХ равен 3?

loopz for_loop ; СХ=СХ-1; если СХ<>О, и если ВХ=3 ,переход к for_loop

for f i n i s h: ;если СХ = О или если ВХ <>3, выходим

Команда LOOPNZ работает аналогично, но дополнительное условие противоположно: переход будет выполнен только если СХ (ЕСХ) не равен 0 и в то же время ZF равен 0. Другое имя этой команды — LOOPNE.

examination/asm/question17.txt · Последние изменения: 2014/01/15 12:12 (внешнее изменение)