【问题标题】:Is this requivalent to the ret instruction?这相当于 ret 指令吗?
【发布时间】:2018-11-01 19:47:22
【问题描述】:

是64位x86 asm序列:

pop r11
jmp r11

...相当于ret附近,除了它破坏r11

【问题讨论】:

  • 对于非叶函数,它可能不符合 Win64 ABI,但这不是语义所固有的
  • 在 64 位模式下,只有C3(接近返回)在功能上等同于pop,然后是FF /4(接近绝对间接跳转)。其他变体不一定等价。
  • @harold - 好点子,尽管在我的情况下,我是在有人试图hack together their own coroutines 的情况下问的,所以我认为他们在正确的 SEH 处理上几乎是 SOL。跨度>
  • @HadiBrais - 谢谢,我的意思是即将返回并更新问题以反映这一点。
  • 在架构上,当然,除非你在它前面加上前缀。 (例如,操作数大小可以将其转换为 pop r11w,但 IIRC ret 的操作数大小固定为 64,并且不受 66 前缀的影响)。在微架构上,显然不是(这就是重点)。

标签: assembly x86 return


【解决方案1】:

通常,近返回 C3 在功能上等同于 pop reg 后跟 FF /4 reg 形式的跳转(跳转接近绝对间接)。它们都将堆栈顶部的 64 位值弹出到RIP。在 64 位模式下,它们也可能在相同情况下引发相同的异常。特别是,当从堆栈加载到非规范地址时,会发生#SS(0)。此外,当新的RIP 值指向非规范地址时,#GP(0) 会发生。此外,#PF#AC(0) 可以在任何内存访问时引发。因此,如果有可能发生这些异常之一,并且如果处理异常的代码可能会根据所使用的指令序列表现不同,那么它们实际上在功能上并不等同,确切地说。我假设有一些免费的 GPR,例如r11。否则,如果需要通过将一个寄存器溢出到内存来释放一个寄存器,那么这样的过程可能会对架构状态产生影响,而简单地使用C3 不会发生这种影响。

【讨论】:

    猜你喜欢
    • 2013-12-06
    • 2017-09-04
    • 2013-04-05
    • 1970-01-01
    • 1970-01-01
    • 2018-01-02
    • 2011-07-19
    • 2012-12-15
    • 2018-04-30
    相关资源
    最近更新 更多