跳转到程序集后返回调用

时间:2013-05-03 23:05:18

标签: assembly call

这可能很简单,但我对此感到困惑一段时间了:

假设我有类似

的内容
main:
...
call some_fun
...

some_fun:
...
jmp op
...

op:
...
ret

这会正确地返回到呼叫开始的地方吗?如果没有,那么ret将如何正确返回?

2 个答案:

答案 0 :(得分:7)

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

假设您正在使用x86程序集,以下是正在进行的操作。

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

答案 1 :(得分:0)

如果它仍然崩溃,那么试试

移动dword [stak],esp;一开始就

结束

mov esp,[stak]

保留

有点儿的事情

GL