петля, петля, петля?

В чем разница между инструкциями по сборке LOOP, LOOPE и LOOPNE?


person nunos    schedule 18.11.2009    source источник
comment
Не используйте эти инструкции; они очень медленны на современных процессорах. Вместо этого используйте ветвление вручную.   -  person alex strange    schedule 23.11.2009
comment
@Alex Strange: у вас есть доказательства, подтверждающие ваше заявление? Спасибо.   -  person Timotei    schedule 26.10.2010
comment
@Timotei Dolean: см. таблицы инструкций на agner.org/optimize. Учебник по ЦП, в котором обсуждается микрокодирование (и, надеюсь, некоторые из них так и делают), объяснит аргументацию.   -  person alex strange    schedule 27.10.2010
comment
@alexstrange: по теме: Почему инструкция цикла работает медленно? Разве Intel не могла реализовать это эффективно? есть некоторые подсчеты мопов и показатели пропускной способности для loop на различных последних микроархитектурах, а также немного истории того, как мы оказались в этой ловушке 22: никто использует его, потому что он медленный / не стоит делать его быстрее, потому что его никто не использует. Если бы он был быстрым, он часто экономил бы размер кода и отлично подходил для циклов adc (особенно на процессорах с остановкой частичного флага, таких как Nehalem и более ранние версии).   -  person Peter Cordes    schedule 28.05.2018


Ответы (4)


LOOP уменьшает значение ecx и проверяет, не равен ли ecx нулю, если это условие выполнено, выполняется переход на указанную метку, в противном случае происходит сбой.

LOOPE уменьшает ecx и проверяет, что ecx не равен нулю и установлен ZF - если эти условия выполняются, он переходит на метку, иначе не проходит.

LOOPNE аналогичен LOOPE, за исключением того, что для выполнения перехода требуется, чтобы ZF не был установлен (т.е. был равен нулю).

person sharptooth    schedule 18.11.2009
comment
Также не спрашивали. Я хотел бы отметить, что все инструкции LOOP намного медленнее, чем аналог DEC ECX / JNZ. Это предназначено, поскольку LOOP в настоящее время должен использоваться только для контуров калибровки задержки, используемых для аппаратных драйверов и т.п. - person Nils Pipenbrinck; 18.11.2009
comment
@NilsPipenbrinck: На каких процессорах он медленнее? Какой у вас источник? - person Janus Troelsen; 18.05.2013
comment
@JanusTroelsen, начиная с 80486, он медленнее. На последних процессорах он намного медленнее. Источник: agner.org/optimize руководство №2. - person Johan; 18.10.2013
comment
@sharptooth, говоря о LOOPE, как после уменьшения ECX может быть ненулевым, а ZF установлен? LOOPE не влияет на флаг ZF? - person golem; 04.09.2015
comment
Отвечая на мой собственный вопрос. После проверки в gdb я могу подтвердить, что ни одна из инструкций цикла (LOOP, LOOPE, LOOPNE) не влияет на флаг ZF, когда они уменьшают счетчик ECX. Теперь это имеет смысл. - person golem; 04.09.2015

Время для Справочник по Google Книгам

РЕДАКТИРОВАТЬ: Сводка из ссылки: LOOPE и LOOPNE по сути являются инструкциями LOOP с одной дополнительной проверкой. LOOPNE зацикливается «при нулевом флаге», что означает, что он будет зацикливаться до тех пор, пока нулевой флаг ZF равен единице и приращение не достигнуто, а LOOPNE зацикливается «пока не нулевой флаг», что означает, что цикл продолжается до тех пор, пока ZF равен нулю и прирост не достигается. Имейте в виду, что ни одна из этих инструкций не влияет на состояние ZF.

person Matthew Jones    schedule 18.11.2009
comment
Я считаю, что лучше всего не только предоставить ссылку, но и процитировать соответствующий материал из источника, если ссылка когда-либо станет недействительной. - person Thomas Owens; 18.11.2009

Инструкции LOOP, а также JCXZ/JECXZ немного медленные; однако они все еще имеют свое место в современном коде.

Высокая скорость не всегда является проблемой в петлях. Например, если мы выполняем цикл только один раз во время инициализации программы и количество итераций невелико, требуемое время не будет замечено.

Другой пример — цикл, в котором вызываются функции Windows API; время, потраченное на вызов API, вероятно, делает время выполнения LOOP тривиальным. Опять же, это применимо, когда количество итераций невелико.

Рассматривайте эти инструкции как «еще один инструмент в вашем наборе инструментов»; используйте правильный инструмент для работы;)

person DednDave    schedule 02.07.2011

Вы пытались найти его в справочнике по набору инструкций, , например, в этом Intel?

person starblue    schedule 18.11.2009