Я не могу понять, как работает флаг направления в x86
. Текст в моих лекциях говорит, что он увеличивает или уменьшает исходный или целевой регистр, но это не имеет смысла с его именем. Может кто-нибудь объяснить, что он делает?
Флаг направления в x86
Ответы (2)
Этот флаг используется в операциях со строками и указывает, начинаются ли строки с младшего адреса и переходят к более высоким адресам или наоборот.
Для строковых инструкций ECX
указывает количество итераций, DS:ESI
— адрес источника, а ES:EDI
— пункт назначения (отсюда s в ESI
и d в EDI
).
После каждой итерации ECX
уменьшается на единицу, а ESI
и EDI
либо увеличиваются, либо уменьшаются на размер элемента (1 для операций с байтами, 2 для операций со словами и т. д.) в соответствии с EFLAGS.DF
.
Если EFLAGS.DF
равно 0
, ESI
и EDI
увеличиваются, иначе уменьшаются.
Возьмем rep movsb
в качестве примера инструкции, зависящей от флага направления.
Когда вы делаете rep movsb
, вы указываете исходный адрес в esi
, адрес назначения в edi
и счет в ecx
. Процессор в основном выполняет цикл. В обычном случае (когда флаг направления сброшен) он увеличивает esi
и edi
на каждой итерации цикла, поэтому вы инициализируете их так, чтобы они указывали на начало исходного и целевого блоков, которые вы копируете. При выполнении REP MOVSB
процессор увеличивает адреса источника и назначения, пока не достигнет конца копируемого блока.
Когда установлен флаг направления, процессор вместо этого уменьшает регистры. Это означает, что вам нужно начать с них, указывающих на конец копируемого блока памяти. Вместо того, чтобы начинать с начала и копировать до конца, он начинает с конца и копирует в обратном направлении, пока не доберется до начала.