2

这可能很容易,但我对此感到困惑一段时间:

假设我有类似的东西

main:
...
call some_fun
...

some_fun:
...
jmp op
...

op:
...
ret

这 ret 会正确返回到通话开始的地方吗?如果不是,那么 ret 将如何正确返回?

4

2 回答 2

8

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

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

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

希望这可以帮助。

于 2013-05-03T23:35:27.613 回答
1

如果它仍然崩溃,然后尝试

move dword[stak],esp ;一开始

并以

mov esp,[stak]

ret

有点东西

于 2013-05-04T01:28:37.130 回答