Флаг направления в x86

Я не могу понять, как работает флаг направления в x86. Текст в моих лекциях говорит, что он увеличивает или уменьшает исходный или целевой регистр, но это не имеет смысла с его именем. Может кто-нибудь объяснить, что он делает?


person Community    schedule 30.04.2012    source источник


Ответы (2)


Этот флаг используется в операциях со строками и указывает, начинаются ли строки с младшего адреса и переходят к более высоким адресам или наоборот.

Для строковых инструкций ECX указывает количество итераций, DS:ESI — адрес источника, а ES:EDI — пункт назначения (отсюда s в ESI и d в EDI).

После каждой итерации ECX уменьшается на единицу, а ESI и EDI либо увеличиваются, либо уменьшаются на размер элемента (1 для операций с байтами, 2 для операций со словами и т. д.) в соответствии с EFLAGS.DF.

Если EFLAGS.DF равно 0, ESI и EDI увеличиваются, иначе уменьшаются.

person Nathan Fellman    schedule 30.04.2012
comment
Таким образом, он соответственно увеличивает или уменьшает строку. Если строка начинается с более низкого адреса, она будет добавляться к ней или в другом случае будет выполняться наоборот, верно? - person ; 30.04.2012
comment
Натан Феллман, @Jerry Coffin, я думаю, что поведение по умолчанию — копирование с начала блока памяти (DF очищается). В каких случаях вместо этого нужно скопировать блок памяти с конца (набор DF)? - person golem; 20.08.2015
comment
@golem: рассмотрите возможность копирования стеков, которые обычно растут вниз. Рассмотрите возможность сравнения (а не копирования) строк, где вы хотите проверить в обратном направлении до первого отличия. В этих случаях направление имеет значение. - person Nathan Fellman; 20.08.2015
comment
Другой вариант использования, который я только что обнаружил, — это когда вы хотите вставить подстроку в строку и для этого переместить хвостовую часть вправо. В этом случае вам нужно скопировать байт из местоположения len(str) в len(str)+len(substr), затем len(str-1) в len(str-1)+len(substr) и т.д. вниз в памяти. - person golem; 19.09.2015

Возьмем rep movsb в качестве примера инструкции, зависящей от флага направления.

Когда вы делаете rep movsb, вы указываете исходный адрес в esi, адрес назначения в edi и счет в ecx. Процессор в основном выполняет цикл. В обычном случае (когда флаг направления сброшен) он увеличивает esi и edi на каждой итерации цикла, поэтому вы инициализируете их так, чтобы они указывали на начало исходного и целевого блоков, которые вы копируете. При выполнении REP MOVSB процессор увеличивает адреса источника и назначения, пока не достигнет конца копируемого блока.

Когда установлен флаг направления, процессор вместо этого уменьшает регистры. Это означает, что вам нужно начать с них, указывающих на конец копируемого блока памяти. Вместо того, чтобы начинать с начала и копировать до конца, он начинает с конца и копирует в обратном направлении, пока не доберется до начала.

person Jerry Coffin    schedule 30.04.2012