为了账号安全,请及时绑定邮箱和手机立即绑定

“ rep ret”是什么意思?

“ rep ret”是什么意思?

MMTTMM 2019-11-02 11:03:42
我在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。


查看完整回答
反对 回复 2019-11-02
  • 3 回答
  • 0 关注
  • 1839 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信