我在Visual Studio 2008上测试了一些代码并注意到了security_cookie
.我能理解它的重点,但我不明白这条指令的目的是什么.
rep ret /* REP to avoid AMD branch prediction penalty */
当然我可以理解评论:)但是这个前缀exaclty在上下文中做了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 } }
Igor Skochin.. 45
这个指令后面有一个完整的博客.第一篇文章描述了它背后的原因:http://repzret.org/p/repzret/
基本上,在AMD的分支预测器中存在一个问题,当单字节ret
紧跟在你引用的代码中的条件跳转之后(以及其他一些情况),并且解决方法是添加rep
前缀,CPU忽略该前缀.修正预测惩罚.