Ну, я знаю, что CLD очищает флаг направления и STD устанавливает флаг направления. но какая точка в настройке и флаге направления очистки?
Что такое CLD и STD для языка ассемблера x86? Что делает DF?
Ответ 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
).
Ответ 2
CLD CLires называет флаг направления, данные идут дальше. STD Определяет флаг направления, данные идут назад.
Ответ 3
Если вы используете Windows, то согласно соглашению о вызове STDCALL -
В соответствии с STDCALL флаг направления становится ясным при входе и должен быть вернулся ясно.
Итак, если вы установите DF, то перед вызовом API вы должны очистить его.
Ответ 4
CLD: очистить флаг направления, чтобы указатели строк автоматическое добавление после каждой операции строки
STD: std используется, чтобы установить флаг направления в 1, чтобы SI и/или DI автоматически уменьшались, чтобы указывать на следующий строковый элемент, когда выполняется одна из инструкций строки. Если флаг направления установлен, SI/DI будет уменьшаться на 1 для строк байтов и 2 для словных строк.
Этот ответ может быть вам полезен.