ЦП никогда не устанавливает и не сбрасывает флаг направления автоматически.Это делается только программным обеспечением.
ЦПУ использует флаг направления при выполнении строковых инструкций, чтобы определить, увеличивать или уменьшать SI
и DI
.
Обычно DF
остаетсяочистить все время.Программное обеспечение должно установить DF
перед использованием строковой инструкции, для которой SI
и DI
должны быть уменьшены.
Одна из причин, по которой вы можете захотеть уменьшить SI
и DI
, заключается в выполнениикопия памяти, где буферы перекрываются, а адрес источника меньше, чем адрес назначения.В этом случае обычная прямая копия перезапишет часть исходного буфера до того, как он будет прочитан, а обратная копия будет работать.
Для обратной копии требуется указатели (DS:)SI
и ES:DI
, изначально указывающие насамый высокий элемент, который нужно переместить, вместо самого низкого.(По-прежнему первый байт, который нужно скопировать.)
На текущих процессорах Intel (например, Skylake) назад std
/ rep movsb
на намного медленнее, чем прямое копирование.Оптимизированный микрокод, который копирует в 16- или 32-байтовые чанки, активируется только для случая прямого копирования cld
/ DF = 0.
Например, цикл повторения итерации 1000000 вокруг 4096 байт rep movsb
с выровненнымисточник и пункт назначения заняли ~ 42 мс вперед или ~ 1000 мс назад на i7-6700k Skylake с частотой около 4,1 ГГц в длинном режиме.Производительность в реальном режиме должна быть одинаковой.
repe/ne cmpsb
или repe/ne scasb
всегда медленны (всего 1 байт за раз) и, вероятно, не медленнее с DF = 1 против DF = 0.Только rep movs
и rep stos
имеют оптимизированный микрокод.
На ранних процессорах x86, таких как оригинальные 8086–286, все инструкции rep
-строки имели преимущество небольшого размера кода и не требовали извлечения инструкций при загрузке /хранение данных.И не было SIMD векторных инструкций, которые вы могли бы использовать вместо того, чтобы идти намного быстрее.