我在Visual Studio 2008上測試了一些代碼,并注意到security_cookie。我可以理解它的要點,但是我不明白此指令的目的是什么。 rep ret /* REP to avoid AMD branch prediction penalty */當然我可以理解注釋:),但是前綴前綴在和的上下文中是做ret什么的,如果ecx!= 0 會發生什么呢?顯然,ecx在調試時將忽略來自的循環計數,這是可以預期的。我在此處找到此代碼(出于安全考慮,由編譯器注入):void __declspec(naked) __fastcall __security_check_cookie(UINT_PTR cookie){ /* x86 version written in asm to preserve all regs */ __asm { cmp ecx, __security_cookie jne failure rep ret /* REP to avoid AMD branch prediction penalty */failure: jmp __report_gsfailure }}
3 回答

POPMUISE
TA貢獻1765條經驗 獲得超5個贊
顯然,某些AMD處理器的分支預測器在分支的目標或穿透是ret指令時表現不佳,并且添加rep前綴可以避免這種情況。
關于的含義rep ret,《英特爾指令集參考》中沒有提及此指令序列,并且的文檔rep不是很有幫助:
當與非字符串指令一起使用時,REP前綴的行為是不確定的。
這意味著至少rep不必重復操作。
現在,從AMD指令集參考(1.2.6重復前綴)中:
前綴僅應與此類字符串指令一起使用。
通常,僅在上面表1-6、1-7和1-8中列出的字符串指令(不包含ret)中使用重復前綴。
因此,實際上似乎是未定義的行為,但是可以假設,實際上,處理器只是忽略指令的rep前綴ret。
添加回答
舉報
0/150
提交
取消