ХАНДЫФАР

Инструкция LOOP


Выполнять цикл в соответствии со счётчиком CX


LOOP rel8 - Уменьшает значение CX; короткий переход, если CX≠0.

LOOPE\LOOPZ rel8 - Уменьшает значение CX; короткий переход, если CX≠0 или ZF=1.

LOOPNE\LOOOPNZ rel8 - Уменьшает значение CX; короткий переход, если CX≠0 или ZF=0.


Выполняет циклическую операцию, используя регистр cx в качестве счётчика.


Каждый раз, когда выполняется команда loop, регистр счётчика cx уменьшается, а затем проверяется на значение 0. Если счётчик равен 0, цикл завершается и выполнение программы продолжается с инструкцией, следующей за инструкцией loop. Если счётчик не равен нулю, выполняется ближний переход к целевому операнду, который, предположительно, является инструкцией в начале цикла.


Целевая инструкция задаётся с относительным смещением (смещение со знаком относительно текущего значения указателя команды в регистре IP). Это смещение обычно указывается как метка в ассемблерном коде, но на уровне машинного кода оно кодируется как 8-разрядное непосредственное значение со знаком, которое добавляется к указателю инструкции. В соответствии с этой инструкцией допускаются смещения от -128 до +126.


Некоторые формы инструкции цикла (LOOPcc) также принимают флаг ZF в качестве условия для завершения цикла до того, как счётчик достигнет нуля. В этих формах инструкции с каждой инструкцией связан код условия (cc), указывающий на тестируемое условие. Здесь сама инструкция LOOPcc не влияет на состояние флага ZF; флаг ZF изменяется другими инструкциями в цикле.


Предположим, что регистр-счётчик cx содержит 1010. Далее создаём метку которая будет служить началом цикла. Внутри цикла мы будем выполнять inc ax которая будет увеличивать значение регистра ax на 1. Затем инструкция loop будет уменьшать значение регистра-счётчика cx на 1 и сравнивать его с 0. Как только регистр-счётчик cx будет равен 0, цикл прекратит своё выполнение и программа продолжить выполнять следующие за циклом инструкции. Обратите внимание что, значение регистра-счётчика cx должно находится за пределами цикла в котором выполняются другие инструкции. Ещё нужно иметь ввиду что, если внутри цикла мы изменим значение регистра-счётчика cx, то цикл будет работать не так как мы хотим, поэтому нужно всячески избегать использование регистра-счётчика cx внутри цикла.


  1. title Автор: Довгополов Евгений Сергеевич
  2. .model small
  3. .stack 100h
  4. code segment public
  5. ____assume cs:code
  6. ____main proc
  7. ________mov_____cx, 10
  8. ____MainLoop:
  9. ________inc_____ax
  10. ________loop____MainLoop
  11. ________mov_____ax, 4C00h
  12. ________int_____21h
  13. ____main endp
  14. code ends
  15. end main

Инструкция LOOP


Выполнять цикл в соответствии со счётчиком CX


________LOOP rel8 - Уменьшает значение CX; короткий переход, если CX≠0.

________LOOPE\LOOPZ rel8 - Уменьшает значение CX; короткий переход, если CX≠0 или ZF=1.

________LOOPNE\LOOOPNZ rel8 - Уменьшает значение CX; короткий переход, если CX≠0 или ZF=0.


Выполняет циклическую операцию, используя регистр cx в качестве счётчика.


Каждый раз, когда выполняется команда loop, регистр счётчика cx уменьшается, а затем проверяется на значение 0. Если счётчик равен 0, цикл завершается и выполнение программы продолжается с инструкцией, следующей за инструкцией loop. Если счётчик не равен нулю, выполняется ближний переход к целевому операнду, который, предположительно, является инструкцией в начале цикла.


Целевая инструкция задаётся с относительным смещением (смещение со знаком относительно текущего значения указателя команды в регистре IP). Это смещение обычно указывается как метка в ассемблерном коде, но на уровне машинного кода оно кодируется как 8-разрядное непосредственное значение со знаком, которое добавляется к указателю инструкции. В соответствии с этой инструкцией допускаются смещения от -128 до +126.


Некоторые формы инструкции цикла (LOOPcc) также принимают флаг ZF в качестве условия для завершения цикла до того, как счётчик достигнет нуля. В этих формах инструкции с каждой инструкцией связан код условия (cc), указывающий на тестируемое условие. Здесь сама инструкция LOOPcc не влияет на состояние флага ZF; флаг ZF изменяется другими инструкциями в цикле.


Предположим, что регистр-счётчик cx содержит 1010. Далее создаём метку которая будет служить началом цикла. Внутри цикла мы будем выполнять inc ax которая будет увеличивать значение регистра ax на 1. Затем инструкция loop будет уменьшать значение регистра-счётчика cx на 1 и сравнивать его с 0. Как только регистр-счётчик cx будет равен 0, цикл прекратит своё выполнение и программа продолжить выполнять следующие за циклом инструкции. Обратите внимание что, значение регистра-счётчика cx должно находится за пределами цикла в котором выполняются другие инструкции. Ещё нужно иметь ввиду что, если внутри цикла мы изменим значение регистра-счётчика cx, то цикл будет работать не так как мы хотим, поэтому нужно всячески избегать использование регистра-счётчика cx внутри цикла.


  1. title Автор: Довгополов Евгений Сергеевич
  2. .model small
  3. .stack 100h
  4. code segment public _______; Начало сегмента кода
  5. ____assume cs:code
  6. ____main proc _____________; Начало процедуры main
  7. ________mov_____cx, 10 ____; Устанавливаем счётчик равным 10
  8. ____MainLoop:
  9. ________inc_____ax_________; Увеличиваем значение регистра ax на 1
  10. ________loop____MainLoop___; Выполняем цикл пока CX≠0
  11. ________mov_____ax, 4C00h__; Копируем значение функции завершения процесса в ah а значение в al
  12. ________int_____21h _______; Вызываем прерывание DOS
  13. ____main endp _____________; Конец процедуры main
  14. code ends _________________; Конец сегмента кода
  15. end main __________________; Конец файла. Точкой входа указывается процедура main
Made on
Tilda