Предыдущий раздел ОСНОВНЫЕ ОПЕРАТОРЫ АССЕМБЛЕРА Следующий раздел

1.5.3. Операторы циклов

Цикл – многократное повторение группы операторов, называемых телом цикла, до тех пор, пока выполняется некоторое условие (рис. 96). Типичное условие цикла: повторить тело цикла заданное число раз. Число повторений обычно заносится в регистр СХ. Реализация такого цикла с помощью условного оператора jnz:

 

dec    cx

jnz     Begin

 

Это же самое можно сделать с помощью специального оператора цикла loop:

                  

 

Рис. 96. Блок-схема  цикла

  

Оператор loop уменьшает содержимое регистра CX на 1 и выполняет переход, если  (СХ) ¹ 0. Следующий фрагмент программы выполняет сложение М слов, начинающихся с адреса Array. Результат записывается в слово с именем Total:

 

mov cx, M

mov ax, 0

mov si, ax

.L1:

add ax, [Array+si]

add si, 2                           ;  Инкремент индекса на 2

loop .L1

mov [Total], ax

 

Существуют еще два оператора циклов – loopz (или loope) и loopnz (или loopne). Условием  повторения для loopz является (СХ)¹0 & ZF=1. Т.е. кроме ненулевого содержимого счетчика СХ требуется, чтобы был установлен флаг нуля. Условием повторения для loopnz является (СХ)¹0 & ZF=0. Подобный оператор обычно используется для поиска в массиве заданного элемента.

Пример. Пусть метка Ascii присвоена первой ячейке массива из L символов. Требуется найти в этом массиве пробел (код ASCII пробела – 20h). Если пробела нет, требуется перейти на оператор с меткой Not. Соответствующий фрагмент программы:

 

mov   cx, L

mov   si, -1                              ;   Инициализировать индекс

mov   al, 20h                           ;   Код пробела àAL

.Next:  

     inc     si                                   ;   Инкремент индекса

cmp   al, [Ascii+si]                 ;  Проверка на пробел

loopne   .Next                          ;   Если не пробел, то цикл

jnz     Not

 

Машинная команда, соответствующая оператору цикла, имеет длину 2 байта. В первом байте находится КОП, а во втором – “расстояние” до команды, помеченной меткой перехода. Подобно команде условного перехода это “расстояние” может находиться в пределах от -128 до +127 байт.

 


Предыдущий раздел В начало Следующий раздел