2014-01-27 133 views
2

我見過的代碼CLD在這裏做什麼?

procedure FillDWord(var Dest; Count, What: dword); assembler ; 
asm 
    PUSH EDI 
    MOV EDI, Dest 
    MOV EAX, What 
    MOV ECX, Count 
    CLD 
    REP STOSD 
    POP EDI 
end; 

我GOOGLE了CLD和它說,它會清除方向標誌...所以這很重要嗎?我刪除它後,功能似乎工作正常。

+4

'CLD'可能被省略,因爲方向標誌必須由於彙編代碼的Delphi規則而被清除。 –

回答

6

方向標誌控制是否 - 在執行REP STOSD期間,寄存器EDI將遞增或遞減。

在清除方向標誌的情況下(例如在執行CLD後)指針將遞增,因此函數執行內存填充。

CLD在此代碼中,因爲程序員可能無法保證方向標誌被清除。因此他確定在執行REP STOSD之前將其清除。

如果代碼在CLD被刪除時起作用,那麼方向標誌在函數的入口處被清除。由於方向標誌不是僅僅靠運氣的調用約定的一部分。這可能是下一次的其他方式,在這種情況下,您的程序很可能會崩潰。

清除/設置標誌是一種非常快速的操作,所以最好將它們添加到彙編代碼中。這也使其他程序員很容易理解你的函數,因爲方向標誌的狀態是明確定義的。

+1

對於替代措辭的建議:「增加或不增加」聽起來有點像寄存器可以保持不變。如果它表示「遞增或遞減」,則會更清楚。 – Michael

+0

@邁克爾感謝您的閱讀作品。 –

2

stosd命令可以減少內存,遞增EDI或增加內存,減少內存。這取決於方向(「D」)標誌的值。如果在函數入口時該標誌被設置爲1,並且從未明確清除,它將會非常糟糕。關於該標誌的默認值沒有約定;所以功能起到安全的作用。

編輯:葉戈爾說德爾福有一個約定:)仍然,比對不起安全。