КОМАНДА LOOP ПЕРЕХОД ПО СЧЕТЧИКУ

LOOP короткая_метка

Логика работы команды

<CX>= Число повторения циклов

label: Тело цикла

...

<CX>=<CX>-1

if(<CX><>0) goto label

 

Реализация цикла без команды LOOP

mov cx, количество циклов

label:

........

DEC cx

CMP CX,0

JNE label

Передачу управления на короткую метку для базовых процессоров является обязательным. Поскольку условие выхода из цикла проверяется в его конце при значении счетчика = 0 цикл все равно выполнится, ТАКЖЕ ПРОИЗОЙДЕТ ЗАЦИКЛИВАНИЕ. Что бы избежать зацикливание содержимое <cx> проверяется до начала цикла. По-этому стандартная последовательность команд для организации цикла с счетчиком имеет вид:

mov cx,counter

JCXZ Exit ;если <cx>=0 обойти цикл

label

.....

.....

loop label

ПРИМЕР:

Вычислить значение факториала числа

locals @@ - директива позволяет не думать о дублировании имен меток в разных программах. Метки с префиксов @@ считаются локальными. Если компилятор встречает метку с таким же именем при компиляции изменяется имя метки.

 

.model LARGE, C

Locals @@

.code

Extrn C n:word, p:word

Public C FACTORIAL

FACTORIAL proc far

mov cx,n

mov si,1 ;регистр индекса источника

mov ax,si

JCXZ @@Exit

@@begin:

mul si ;<dx;ax>=<ax><si>

inc si

loop @@begin

@@Exit

mov, p

FUCTORIAL endp

end

Д/З Написать программу вычисления факториала на C++

КОМАНДА LOOPe(LOOPz)

команда имеет 2 равнозначных имени

LOOPe - если равно

LOOPe - если ноль

Логика работы

<cx>=counter

label:

...

<cx>=<cx>-1

if(<cx><>0) and ZF=1

Данная команда применяется если нужно досрочно выйти из цикла как только находится первый элемент отличный от заданной величины. Антиподом этих команд есть:

LOOPne(LOOPnz)

В отличии от LOOPe(LOOPz) ZF проверяется на 0

<cx>=counter

label:

......

<cx>=<cx-1>

if(<cx><>0) and ZF=0 goto label

Эта команда выходит из цикла как только находится первый элемент равный заданной величине.

Пример:

Вычислить значение суммы чисел натурального ряда от 1 до n вычисления закончить как только сумма станет равной некоторому к или будут перебраны все n чисел

; SUM.ASM

;s=1+2+3+...+n

;выход если s>=k

.model LARGE,C

Local @@

Extrn C n:word, s:word, k:word

Public SUM

SUM proc far

mov cx,n

xor ax, ax

xor si, si

jcxz Exit

@@begin:

inc si

add ax, si

cmp ax, k ;если <ax>-k==0 то ZF=1

loopne @begin

@@Exit

mov s,ax

ret

SUM endp

end

д/з С++ вычисление суммы чисел натурального ряда с асм модулем