2012-03-09 1234 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。

此答案可能對您有所幫助。