Для организации циклов применяется команда цикла
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.