x86中的方向标志

fud*_*din 6 x86 assembly microprocessors eflags

我无法理解方向标志是如何工作的x86.在我的演讲中的文本说,它递增递减目的寄存器但这没有任何意义与它的名字.有人可以解释它的作用吗?

Nat*_*man 9

此标志用于字符串操作,并指定字符串是从低地址开始并继续到更高地址,反之亦然.

对于字符串指令,ECX具有迭代次数,DS:ESI具有源地址并ES:EDI具有目标(因此s in ESId in EDI).

每次迭代后,ECX减一,并ESIEDI要么递增或元素大小(1字节操作,2字操作等)根据递减EFLAGS.DF.

如果EFLAGS.DF0,ESIEDI递增的,否则他们正在递减.

  • @golem:考虑复制通常向下增长的堆栈。考虑比较(而不是复制)字符串,在那里您要向后检查直到第一个差异。在这些情况下,方向很重要。 (2认同)

Jer*_*fin 5

让我们以rep movsb依赖于方向标志的指令为例。

当执行a时rep movsb,您在中提供源地址,在esi中提供目的地地址edi,并计数ecx。处理器基本上执行循环。在正常情况下(方向标志清除时),它会递增,esi并且edi每次循环都会迭代,因此您将其初始化为指向要复制的源块和目标块的开头。执行时REP MOVSB,处理器会递增源地址和目标地址,直到到达要复制的块的末尾。

设置方向标志后,处理器将递减寄存器。这意味着您需要从它们开始,指向您要复制的内存块的末尾。它不是从头开始并复制到末尾,而是从头开始并向后复制直到到达头。