TITLE prg_10_2

STACK SEGMENT PARA STACK ‘STACK’

DB 64 DUP(‘STACK’); Область стека

STACK ENDS

DSEG SEGMENT PARA PUBLIC ‘DATA’

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; возврат управления операционной системе

CSEG ENDS

END START


да

       
   
 
 


нет

       
 
   
 


нет

       
 
   
 


да

 
 


Нет Да

Но, учитывая важность такого алгоритмического элемента, как цикл, разработчики предусмотрели специальные команды цикла

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 для организации вложенных циклов.


Понравилась статья? Добавь ее в закладку (CTRL+D) и не забудь поделиться с друзьями:  



double arrow
Сейчас читают про: