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

10-13 09:13