我在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
提交
取消