2012-03-09 185 views

回答

29

方向标志用于影响字符串指令偏移指针寄存器的方向。这些说明可以使用with the REP prefix来重复操作。 (尽管lodsrep不是很有用)。

字符串指令是:MOVS(复制MEM到MEM),STOS(存储AL/AX/EAX/RAX),SCAS(扫描字符串),CMPS(比较字符串),并LODS(负载字符串)。内存和IO端口之间的复制也有ins/outs。每个指令都有字节,字,双字和qword操作数大小。

概括地说,当方向标志是0,该指令通过递增的指针数据每一次迭代之后(直到ECX是零或一些其它条件,这取决于REP前缀的香味)工作,而如果该标志是1,指针递减。

例如,movsd副本(在64位模式或RDI)一个双字从[ds:esi][es:edi],并执行此:(参见链接ISA参考手册条目中的“操作”部分从英特尔的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 CPU的具有优化的“快速字符串”微码与16字节或32字节的内部操作做复制(或stos存储)。另见this Q&A about memory bandwidth and the ERMSB feature。 (注意只有rep stosrep movs这样优化,而不是repne/repe scascmps)。

2

如果使用的是Windows,然后按stdcall调用 -

在STDCALL,方向标志是进入明确的,并且必须是 返回明确。

因此,如果您设置了DF,那么在调用API之前,您必须将其清除。

+0

依赖操作系统。 – amanuel2 2016-10-04 20:02:34

+0

这在大多数32位/ 64位调用约定中很常见,包括i386 System V和x86-64 System V.它可以让您(或编译器)在没有CLD指令的情况下有效地内嵌'rep movsd' /'rep stosd'。 (在现代x86上,它们往往只是快速向上,DF = 0) – 2017-12-03 19:51:16

6

CLD CLears方向标志,数据向前。 STD设置方向标志,数据向后。

0

CLD:明确的方向标志,以便每个字符串操作之后该字符串指针 自动递增

STD: STD用于将方向标志设置为1,使得Si和/或DI将自动递减到当其中一个字符串指令执行时指向下一个字符串元素。如果方向标志被设置,SI/DI对于字节字符串将减1,对于字符串将减2。

此答案可能对您有所帮助。