В чем разница между инструкциями по сборке LOOP
, LOOPE
и LOOPNE
?
петля, петля, петля?
Ответы (4)
LOOP уменьшает значение ecx и проверяет, не равен ли ecx нулю, если это условие выполнено, выполняется переход на указанную метку, в противном случае происходит сбой.
LOOPE уменьшает ecx и проверяет, что ecx не равен нулю и установлен ZF - если эти условия выполняются, он переходит на метку, иначе не проходит.
LOOPNE аналогичен LOOPE, за исключением того, что для выполнения перехода требуется, чтобы ZF не был установлен (т.е. был равен нулю).
Время для Справочник по Google Книгам
РЕДАКТИРОВАТЬ: Сводка из ссылки: LOOPE и LOOPNE по сути являются инструкциями LOOP с одной дополнительной проверкой. LOOPNE зацикливается «при нулевом флаге», что означает, что он будет зацикливаться до тех пор, пока нулевой флаг ZF равен единице и приращение не достигнуто, а LOOPNE зацикливается «пока не нулевой флаг», что означает, что цикл продолжается до тех пор, пока ZF равен нулю и прирост не достигается. Имейте в виду, что ни одна из этих инструкций не влияет на состояние ZF.
Инструкции LOOP, а также JCXZ/JECXZ немного медленные; однако они все еще имеют свое место в современном коде.
Высокая скорость не всегда является проблемой в петлях. Например, если мы выполняем цикл только один раз во время инициализации программы и количество итераций невелико, требуемое время не будет замечено.
Другой пример — цикл, в котором вызываются функции Windows API; время, потраченное на вызов API, вероятно, делает время выполнения LOOP тривиальным. Опять же, это применимо, когда количество итераций невелико.
Рассматривайте эти инструкции как «еще один инструмент в вашем наборе инструментов»; используйте правильный инструмент для работы;)
Вы пытались найти его в справочнике по набору инструкций, , например, в этом Intel?
loop
на различных последних микроархитектурах, а также немного истории того, как мы оказались в этой ловушке 22: никто использует его, потому что он медленный / не стоит делать его быстрее, потому что его никто не использует. Если бы он был быстрым, он часто экономил бы размер кода и отлично подходил для цикловadc
(особенно на процессорах с остановкой частичного флага, таких как Nehalem и более ранние версии). - person Peter Cordes   schedule 28.05.2018