JUMP和CALL指令有什么不同?它与更高级别的概念,如GOTO或过程调用有什么关系?(我的比较正确吗?)
我是这样想的:
JUMP或GOTO是将控件转移到另一个位置,并且控件不会自动返回到调用点。
另一方面,调用或过程/函数调用返回到调用点。由于它们本质上的差异,语言通常利用堆栈,堆栈帧被推送以“记住”每个调用的过程返回的位置。这种行为也适用于递归过程。在尾递归的情况下,不需要为每个调用“推入”一个堆栈帧。
我们将非常感谢您的回答和意见。
发布于 2009-02-07 10:05:13
关于跳跃和呼叫之间的区别,你是完全正确的。
在具有尾递归的单个函数的示例情况下,编译器可能能够重用现有的堆栈框架。但是,对于相互递归的函数,它可能会变得更加复杂:
void ping() { printf("ping\n"); pong(); }
void pong() { printf("pong\n"); ping(); }
考虑这样一种情况,其中ping()和pong()是接受不同数量参数的更复杂的函数。Mark Probst's paper非常详细地谈到了对GCC的尾递归实现。
发布于 2013-08-19 00:57:36
对你的想法的一个纠正:不仅是尾递归,而且通常是尾部调用,我们不需要堆栈帧,因此可以简单地在那里JMP (假设参数已经正确设置)。
发布于 2013-08-18 20:34:13
根据微处理器,首先检查条件,然后执行跳转操作(转到其他代码),并且不返回。调用操作类似于c
语言中的函数调用,当函数被执行时,它返回以完成其执行。
https://stackoverflow.com/questions/523540
复制相似问题