4.3. Команды цикла

Для организации циклов применяется команда цикла

loop   метка

и её разновидности. Эта команда равносильна последовательности, состоящей из двух команд:

      dec   cx          ;cx=cx-1

      jnz   short ptr метка

и, стало быть, её операнд имеет размер не более одного байта, метка лежит в пределах от –128 до +127 байт команды loop, команда loop работает следующим образом:

1) от cx вычитается 1;

2) если cx¹0, то управление передаётся на метку, иначе выполняется следующая команда.

Например, в случае команд

            mov   cx,0

lab1: add   ax,1

            loop  lab1

при первом выполнении команды loop сначала регистр cx будет уменьшен на 1, а потом его содержимое будет сравниваться с нулем. Поскольку cx станет равным 65535, то произойдет переход на lab1. Затем к ax будет прибавлена единица, а cx станет равным 65534. Цикл будет повторяться до тех пор, пока cx не станет равным 0. Следовательно, команда add ax,1 будет выполнена 65536 раз.

Пример. Следующая программа выводит на экран все символы, коды ASCII которых лежат в диапазоне от 21h=33 до 33+93=126:

!"#$%&'()*+,-./0123456789:;<=>?

@ABCDEFGHIJKLMNOPQRSTUVWXYZ[]^_

`abcdefghijklmnopqrstuvwxyz{|}~

<1>        title ucyll.exe

<2> code   segment

<3>        assume cs:code

<4> start: mov  cx,94       ;число символов

<5>        mov  dl,21h            ;код первого символа

<6> next:  mov   ah,2              ;вывод      символа

<7>        int  21h               ;на экран

<8>        add  dl,1              ;следующий код

<9>        loop next

<10>        mov  ax,4c00h          ;выход

<11>        int  21h

<12> code   ends

<13> end    start

Разновидности команды loop. Следующие команды имеют одинаковые коды:

loope  метка

loopz  метка

переход на метку осуществляется, если cx¹0 и флаг ZF равен 1. Команды

loopne метка

loopnz метка

тоже имеют одинаковые коды, и, значит, действуют одинаково. В них переход на метку осуществляется, если cx¹0 и ZF=0. Во всех этих случаях метка имеет аттрибуты short ptr.