在x86架构中的函数调用期间,返回地址是否没有被压入堆栈?x86 - CALL指令是否总是将EIP指向的地址推送到堆栈?
回答
编号CALL
根据定义,将返回地址推入堆栈之前跳转到目标地址。该返回地址是EIP
(或RIP
)+ sizeof(call instruction)
Volume 2 of the Intel® 64 and IA-32 Architectures Software Developer’s Manual指出CALL
(通常为5个字节):
保存程序链接堆栈,分支到被调用过程的信息使用所述目标 指定操作数。
这包括:
- 近呼叫 - ,其中EIP被压入堆栈“中的当前代码段至程序调用”。
- 远程调用 - “位于与当前代码段不同的段中的过程的调用”,其中CS,EIP被压入堆栈。
替代方案,不推送返回地址,是JMP
。
我熟悉的每个C编译器都将使用CALL
指令始终在x86上实现函数调用,但有一个例外: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
}
任何编译器是否使用汇编语言(例如JMP)中的CALL - RET指令以外的其他方式实现函数调用(以C语言)? – balajimc55
@ balajimc55更新的答案。 –
@ balajimc55如果函数调用标记为内联和/或优化器已打开,则生成的汇编代码可能会完全删除调用指令,并且函数的主体(被调用的函数)正好放在函数内部称它。 –
- 1. x86汇编,堆栈推入指令
- 2. C堆栈指向地址?
- 3. x86堆栈指针指向哪里?
- 4. 如何判断指针是指向堆栈还是指向堆?
- 5. 使用delete之后,指针是否指向堆栈或堆?
- 6. 指向堆栈
- 7. 在x86实模式下选择堆栈指针地址(对齐)
- 8. 获取x86当前指令的地址
- 9. 如何检查指针是否指向iOS上的堆或堆栈内存?
- 10. 找出指针是指向堆栈,堆或程序文本吗?
- 11. x86汇编指令:CALL *注册
- 12. X86'cmpps'指令和LLVM IR'fcmp'指令是否可互换?
- 13. 指针是否可以指向某个值,指针值是否指向该地址?
- 14. 返回指令堆栈中的指针
- 15. 添加指向堆栈的指针C
- 16. x86 - 将8位值推入堆栈
- 17. CIL堆栈交换指令
- 18. DCD指令和IRQ堆栈
- 19. 如何获取基址堆栈指针的地址
- 20. 当我向程序集x86中插入新指令时堆栈的帧大小?
- 21. 错误推送到我自己的堆栈中装配Masm x86
- 22. 通过堆栈溢出重定向指令指针
- 23. 基本的FPU指令/堆栈概述?
- 24. 将SKB推送到网络堆栈
- 25. 堆栈指针的值是多少?
- 26. C指针是指物理地址还是虚拟地址
- 27. 推送到STL堆栈是通过引用传递的,但堆栈是否创建了值的副本?
- 28. 用户堆栈的单指令推/弹而不是附件功能调用?
- 29. 有关基址指针和堆栈指针的问题
- 30. 检查指针是否指向堆上分配的内存
如果您想在没有堆栈访问的情况下执行函数调用,您可能会(错过)使用“系统调用”或“sysenter”指令。 –