【问题标题】:return to call after jumps in assembly在汇编中跳转后返回调用
【发布时间】:2013-05-03 23:05:18
【问题描述】:

这可能是一个简单的问题,但我对此感到困惑一段时间:

假设我有类似的东西

main:
...
call some_fun
...

some_fun:
...
jmp op
...

op:
...
ret

这个 ret 会正确返回到调用开始的地方吗?如果不是,那么ret如何正确返回?

【问题讨论】:

  • 我已经很久没有组装了,但我认为在some_fun 中,您必须在跳转之前将返回地址存储在堆栈中。我认为。 ://

标签: assembly call


【解决方案1】:

如果在提供的示例中,您希望它返回后执行的下一条指令是 call some_fun 之后的指令,那么是的,只要您清理堆栈,它就会完全按照您的意愿执行返回前的帧。

假设您使用的是 x86 程序集,这就是发生的情况。

  1. call some_fun 被执行时,它会将返回地址压入堆栈,然后将程序计数器/指令指针更改为指向 some_fun,以便继续在那里执行。
  2. jmp op 指令不会修改堆栈。它只修改程序计数器/指令指针。
  3. ret 指令从堆栈中弹出一个值并将其转储到程序计数器/指令指针中。它从堆栈中弹出的值称为返回地址。在发出 ret 之前弹出任何 some_funop 已压入堆栈的内容,这一点至关重要。否则,您将返回错误的退货地址。

希望这会有所帮助。

【讨论】:

    【解决方案2】:

    如果仍然崩溃,请尝试

    move dword[stak],esp ;一开始就

    并以

    结尾

    mov esp,[stak]

    退了

    有点意思

    gl

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-04-16
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多