跳转到程序集后返回调用

use*_*942 1 assembly call

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

假设我有类似的东西

main:
...
call some_fun
...

some_fun:
...
jmp op
...

op:
...
ret
Run Code Online (Sandbox Code Playgroud)

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

Spa*_*rky 7

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

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

  1. 当执行调用some_fun时,它会将返回地址压入堆栈,然后将程序计数器/指令指针更改为指向some_fun,以便在那里继续执行.
  2. JMP运算指令不修改堆栈.它只修改程序计数器/指令指针.
  3. RET指令弹出的值从堆栈和它转储到程序计数器/指令指针.它从堆栈中弹出的值称为返回地址.至关重要的是,在发出ret之前,some_funop推入堆栈的任何东西都会被弹出.否则,您将返回错误的返回地址.

希望这可以帮助.