2016-12-11 47 views
4

拆卸時,常常看到不考慮方向標誌(DF)的狀態正在使用該字符串操作指令,是這樣的:86在程序執行期間方向標誌(DF)的默認狀態

or  ecx, 0FFFFFFFFh 
xor  eax, eax 
mov  edi, ebp 
repne scasb 

CLDSTD指令沒有找到,因爲函數開始,既沒有可能影響DF標誌的其他指令。
因爲程序啓動後,編譯器會假定這個標誌的預定義狀態,是否爲加載程序,並在程序運行時保持不變?

+2

復位時,方向標誌被清除。在更改之前保存「DF」被認爲是禮貌的,然後再恢復它。 –

+3

調用約定/ ABI指定「DF」的狀態,編譯器依賴於此。 – Jester

回答

1

編譯器運行時(包括爲操作系統編譯的代碼)會期望標誌處於某種狀態。其他代碼也可以使用這個假設,並且不必一直清除標誌。

MSDN on Direction Flag

2

這是由該平臺的ABI您使用規定。該System V Intel386 ABI(章寄存器和堆棧幀)說:

方向標誌必須設置爲「前進」(即零)進入前 方向,從一個函數退出。

方向在%rFLAGS寄存器標誌DF必須清楚(設置爲 :

同樣要求在AMD64 ABI (Dropbox link, since x86-64.org is down)(部分3.2.1 寄存器和堆棧幀)保存「前進」方向)功能輸入和返回。

所以,是的,用戶級代碼可以安全地假定DF設置爲零。