КОМАНДА 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
д/з С++ вычисление суммы чисел натурального ряда с асм модулем