拆卸時,常常看到不考慮方向標誌(DF)的狀態正在使用該字符串操作指令,是這樣的:86在程序執行期間方向標誌(DF)的默認狀態
or ecx, 0FFFFFFFFh
xor eax, eax
mov edi, ebp
repne scasb
CLD
或STD
指令沒有找到,因爲函數開始,既沒有可能影響DF標誌的其他指令。
因爲程序啓動後,編譯器會假定這個標誌的預定義狀態,是否爲加載程序,並在程序運行時保持不變?
拆卸時,常常看到不考慮方向標誌(DF)的狀態正在使用該字符串操作指令,是這樣的:86在程序執行期間方向標誌(DF)的默認狀態
or ecx, 0FFFFFFFFh
xor eax, eax
mov edi, ebp
repne scasb
CLD
或STD
指令沒有找到,因爲函數開始,既沒有可能影響DF標誌的其他指令。
因爲程序啓動後,編譯器會假定這個標誌的預定義狀態,是否爲加載程序,並在程序運行時保持不變?
編譯器運行時(包括爲操作系統編譯的代碼)會期望標誌處於某種狀態。其他代碼也可以使用這個假設,並且不必一直清除標誌。
這是由該平臺的ABI您使用規定。該System V Intel386 ABI(章寄存器和堆棧幀)說:
方向標誌必須設置爲「前進」(即零)進入前 方向,從一個函數退出。
方向在
%rFLAGS
寄存器標誌DF
必須清楚(設置爲 :同樣要求在AMD64 ABI (Dropbox link, since x86-64.org is down)(部分3.2.1 寄存器和堆棧幀)保存「前進」方向)功能輸入和返回。
所以,是的,用戶級代碼可以安全地假定DF
設置爲零。
復位時,方向標誌被清除。在更改之前保存「DF」被認爲是禮貌的,然後再恢復它。 –
調用約定/ ABI指定「DF」的狀態,編譯器依賴於此。 – Jester