ХАНДЫФАР
Инструкция 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 внутри цикла.
Инструкция 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 внутри цикла.