Предыдущий раздел | ОСНОВНЫЕ ОПЕРАТОРЫ АССЕМБЛЕРА | Следующий раздел |
Цикл – многократное повторение группы операторов, называемых телом цикла, до тех пор, пока выполняется некоторое условие (рис. 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 байт.
Предыдущий раздел | В начало | Следующий раздел |