Ответ 1
Флаг направления используется, чтобы влиять на направление, в котором строковые инструкции смещают регистры указателя. Это те же самые инструкции, которые можно использовать с префиксом REP
, чтобы повторить операцию. (Хотя lods
не очень полезно с REP
).
Строковые инструкции: MOVS
(копировать mem в память), STOS
(хранить AL/AX/EAX/RAX), SCAS
(строка сканирования), CMPS
(сравнить строку) и lods
(строка загрузки). Там также ins
/outs
для копирования между памятью и портом ввода-вывода. Каждая из этих инструкций доступна в байтах, словах, словах и размерах qword.
В двух словах, когда флаг направления равен 0, инструкции работают, увеличивая указатель на данные после каждой итерации (до тех пор, пока ECX
не станет нулем или каким-либо другим условием, в зависимости от вкуса префикса REP
), а если флаг равен 1, указатель будет уменьшен.
Например, movsd
копирует dword из [ds:esi]
в [es:edi]
(или rdi в 64-битном режиме), и делает следующее: (См. раздел "Операция" в связанной справочной записи ISA, извлеченной из файлов Intel PDF).
dword [es:edi] = dword [ds:esi] // 4-byte copy memory to memory
if (DF == 0)
esi += 4;
edi += 4;
else // DF == 1
esi -= 4;
edi -= 4;
fi
С префиксом REP он выполняет это время ECX, а современные процессоры x86 оптимизировали микрокод "быстрых строк", который копирует (или STOS
хранение) с 16-байтовыми или 32-байтными внутренними операциями. См. Также этот Q & A о пропускной способности памяти и функции ERMSB. (Обратите внимание, что оптимизированы только rep stos
и rep movs
, а не repne/repe scas
или CMPS
).