Использование флага направления в 8086 - PullRequest
0 голосов
/ 28 декабря 2018

Я читал в своей книге, что когда регистр SI меньше, чем регистр DI (при манипуляции со строками), тогда флаг направления равен 0, в противном случае флаг направления равен 1.

НоЯ также прочитал, что инструкции обычно не меняют флаг направления, так каково его точное использование?Должны ли мы устанавливать или снимать этот флаг в зависимости от наших строк первого и последнего индекса?(Должны ли мы обработать этот флаг или позволить процессору обработать его?)

Я ошибаюсь в приведенных выше утверждениях?

1 Ответ

0 голосов
/ 28 декабря 2018

ЦП никогда не устанавливает и не сбрасывает флаг направления автоматически.Это делается только программным обеспечением.

ЦПУ использует флаг направления при выполнении строковых инструкций, чтобы определить, увеличивать или уменьшать 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 векторных инструкций, которые вы могли бы использовать вместо того, чтобы идти намного быстрее.

...