x86架构中函数调用时是否存在返回地址不入栈的情况?
No. CALL
根据定义,将在跳转到目标地址之前将返回地址压入堆栈。该返回地址是EIP
(or RIP
) + sizeof(call instruction)
(通常为 5 个字节。)
英特尔® 64 和 IA-32 架构软件开发人员手册第 2 卷 http://www.intel.com/content/www/us/en/architecture-and-technology/64-ia-32-architectures-software-developer-instruction-set-reference-manual-325383.html指出CALL
:
将过程链接信息保存在堆栈上并分支到使用目标指定的被调用过程
操作数。
这包括:
-
临近呼叫— “调用当前代码段中的过程”,其中 EIP 被压入堆栈。
-
Far Call—“对位于与当前代码段不同的段中的过程的调用”,其中 CS、EIP 被压入堆栈。
另一种选择是不推送返回地址JMP
.
我熟悉的每个 C 编译器总是使用 x86 实现函数调用CALL
指令,但有一个例外:a尾调用 https://en.wikipedia.org/wiki/Tail_call,这可以通过JMP
。特别是当一个函数返回另一个函数调用的结果时,尤其会发生这种情况。例如。
int bar(int a, int b);
int foo(int a, int b)
{
if (a < b)
return 0;
return bar(a, b); // Will probably be: jmp bar
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)