跳跃呼叫

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (2)
  • 关注 (0)
  • 查看 (16)

跳转和呼叫指令有何不同?它与更高级别的概念(如Goto或过程调用)有何关联?

跳转或转到是将控件转移到另一个位置,并且控件不会自动返回到调用它的位置。

另一方面,调用或过程/函数调用从调用的位置返回。

由于其本质上的差异,语言通常使用堆栈,并将堆栈帧推送到“记住”每个调用过程返回的位置。这种行为也适用于递归过程。但是,在尾部递归的情况下,不需要将堆栈框架“推”给打电话。

提问于
用户回答回答于

如果在x86程序集中谈论Call/JMP或类似的东西,那么基本上是对的。主要区别是:

  • JMP执行跳转到某个位置,而不执行任何其他操作。
  • 调用将当前指令指针推送到堆栈上(相反,按当前指令后的一个),然后将JMPS推送到该位置。有了RET,就可以回到原来的地方。

通常,调用只是一个使用JMP实现的方便函数。你可以这样做

          movl $afterJmp, -(%esp)
          jmp location
afterJmp:

用户回答回答于

在带有尾递归的单个函数的示例情况下,编译器可以重用现有的堆栈框架。但是,通过相互递归的函数,它可能变得更加复杂:

void ping() { printf("ping\n"); pong(); }
void pong() { printf("pong\n"); ping(); }

考虑一下ping()和pong()是采用不同数量参数的更复杂的函数的情况。

扫码关注云+社区