Mas db 1,0,9,8,0,7,8,0,2,0 ; это заданный одномерный массив байт
Len_mas equ 10 ; количество элементов в массиве, это же количество
;можно получить как len_mas=$ - mas
DSEG ENDS
CSEG SEGMENT PARA PUBLIC ‘CODE’
ASSUME CS:CSEG, DS:DSEG, SS:STACK
START: PUSH DS
SUB AX,AX
PUSH AX
MOV AX,DSEG ; инициировать адрес сегмента данных
MOV DS,AX
MOV СX, LEN_MAS ; в сх – счетчик элементов массива
XOR AX,AX
XOR SI,SI
CYC1: JCXZ EXIT ; проверка сх на 0, если 0, то выход
CMP MAS[SI],0 ;сравнить очередной элемент задан. массива с 0
JNE M1 ; если не равно 0, то на m1
INC AL ; увеличение счетчика нулевых элементов
M1: INC SI ; перейти к следующему элементу
DEC CX ; уменьшить счетчик элементов на 1
JMP CYC1
EXIT: MOV AX, 4C00H
INT 21H ; возврат управления операционной системе
END START
Начало
Инициировать счетчик элементов, обнулить счетчик нулей и смещение первого эл-та
нет
CYC1: Счетчик элементов = 0 ?
да
Конец
Очередной элемент = 0 ?
нет
да
Увеличить счетчик нулей
М1: Нарастить смещение для перехода к следующему элементу
Увеличить счетчик элементов
да
Все элементы просмотрены?
нет да
Но, учитывая важность такого алгоритмического элемента, как цикл, разработчики предусмотрели специальные команды цикла
LOOP метка_перехода,
которая означает ’повторить цикл’. Выполнение команды заключается в следующем:
- вычитании 1 из регистра СХ;
- сравнении регистра СХ с нулем;
- если СХ=0, то управление передается на следующую после LOOP команду, иначе перейти на метку_перехода.
LOOPE/LOOPZ метка_перехода,
которая означает “повторить цикл, пока СХ<>0 или ZF=0”. Обе команды совершенно идентичны, поэтому используйте, при необходимости, любую по Вашему вкусу. Отличаются эти команды от предыдущей пунктом 3 или анализом окончания цикла:
- если СХ>0 и ZF=1, управление передается на метку перехода, иначе если СХ=0 или ZF=0, то выполняется следующая после команды LOOPE/LOOPZ операция.
LOOPNE/LOOPNZ метка_перехода,
которая означает, “повторить цикл, пока СХ<>0 или ZF=1”. Обе команды совершенно идентичны, поэтому используйте, при необходимости, любую по Вашему вкусу. В ней пункт 3 выполняется по следующему правилу:
- если СХ>0 и ZF=0, управление передается на метку перехода, иначе если СХ=0 или ZF=1, то выполняется следующая после команды LOOPNE/LOOPNZ операция.
Общая особенность команд цикла в том, что они используют РОН СХ как счетчик числа циклов, поэтому при их использовании не забудьте до метки_перехода послать в этот регистр нужное число!
Недостаток всех команд цикла в том, что они реализуют только короткие переходы, Для работы с длинными циклами используются команды условного перехода и безусловного перехода. Вот когда у Вас цикл чуть-чуть больше существующих ограничений, есть смысл пересмотреть команды в цикле с целью минимизации их длины!
Для изучения команд цикла на 3-ей лабораторной работе Вам нужно будет разработать программы, близкие к тем, что приведены в листингах 10.3-10.5 (учебник Юрова “Ассемблер)”. Листинг 10.5 показывает, как используются команды засылки счетчика циклов в стек PUSH и восстановления из стека POP для организации вложенных циклов.