“ rep ret”是什么意思?

我在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

    }

}


MMTTMM
浏览 1848回答 3
3回答

POPMUISE

显然,某些AMD处理器的分支预测器在分支的目标或穿透是ret指令时表现不佳,并且添加rep前缀可以避免这种情况。关于的含义rep ret,《英特尔指令集参考》中没有提及此指令序列,并且的文档rep不是很有帮助:当与非字符串指令一起使用时,REP前缀的行为是不确定的。这意味着至少rep不必重复操作。现在,从AMD指令集参考(1.2.6重复前缀)中:前缀仅应与此类字符串指令一起使用。通常,仅在上面表1-6、1-7和1-8中列出的字符串指令(不包含ret)中使用重复前缀。因此,实际上似乎是未定义的行为,但是可以假设,实际上,处理器只是忽略指令的rep前缀ret。
打开App,查看更多内容
随时随地看视频慕课网APP