我在Visual Studio 2008上测试了一些代码,注意到security_cookie
。我可以理解它的要点,但是我不明白此指令的目的是什么。
rep ret /* REP to avoid AMD branch prediction penalty */
当然,我可以理解注释:),但是前缀前缀在
ret
的上下文中是做什么的,如果ecx
为!= 0会发生什么呢?显然,当我调试它时,会忽略ecx
的循环计数。我在此处找到此代码(出于安全考虑,由编译器注入(inject)):
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
}
}
最佳答案
有一个整个博客以此指令命名。第一篇文章描述了其背后的原因:http://repzret.org/p/repzret/
基本上,AMD的分支预测器中存在一个问题,即单字节ret
紧跟在您引用的代码(以及其他一些情况)中的条件跳转之后,并且解决方法是添加rep
前缀,该前缀会被忽略CPU,但修复预测变量。
关于assembly - `rep ret`是什么意思?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/20526361/