Подтвердить что ты не робот

Что такое CLD и STD для языка ассемблера x86? Что делает DF?

Ну, я знаю, что CLD очищает флаг направления и STD устанавливает флаг направления. но какая точка в настройке и флаге направления очистки?

4b9b3361

Ответ 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 для словных строк.

Этот ответ может быть вам полезен.