c++ - 了解 C/C++ 中函数调用的堆栈框架?

标签 c++ c compiler-construction stack

<分区>

我也是 C/C++ 和汇编语言的新手。 这也可能是非常基本的问题。 我试图了解堆栈帧是如何构建的以及哪些变量(参数)以什么顺序被插入堆栈? 一些搜索结果显示....C/C++ 的编译器根据在函数内执行的操作来决定。例如,如果函数假设只是将传递的 int 参数的值增加 1 并返回(类似于++ 运算符),它将把所有 .. 函数的参数和局部变量放在寄存器中的函数中并执行加法。 ...想知道哪个寄存器用于按值返回/传递?....如何返回引用? .....黑白 eax、ebx、ecx 和 edx 的区别。

请求书籍/博客/链接或任何类型的 Material 来理解函数调用期间使用/构建和销毁的寄存器、堆栈和堆引用……以及如何存储 main 函数? 提前致谢

最佳答案

你的问题在这里是边缘性的。 programmers可能是一个更好的地方。

一本了解堆栈等概念的好书可能是 Queinnec 的 Lisp In Small Pieces (它很好地解释了 Lisp 的堆栈是什么)。另外,SICP 是一本好书read .

D.Knuth的书和MMIX也是一本好书。

仔细阅读维基百科Call stack页面。

理论上不需要调用栈,一些语言和实现(例如旧的SML/NJ)不使用任何栈(而是在垃圾收集堆中分配调用帧)。参见 A.Appel 的旧论文 Garbage Collection Can be Faster than Stack Allocation (并了解有关 garbage collection 的更多信息)。

通常 C 和 C++ 实现有一个堆栈(并且经常使用硬件堆栈)。某些 C 局部变量可能没有任何堆栈位置(因为它们已经过优化,或者保存在寄存器中)。有时,C 局部变量的堆栈位置可能会发生变化(编译器会对同一局部变量的某些出现使用一个调用堆栈槽,而对同一局部变量的其他出现使用另一个调用堆栈槽)。当然,一些临时值可能会像局部变量一样被编译(所以留在寄存器中,在一个堆栈槽中,然后在另一个堆栈槽中,等等......)。在优化时,编译器可能会对变量做一些奇怪的把戏。

在一些旧机器上 IBM/360或者我 BM z/series ,没有硬件堆栈; C 编译器使用的堆栈是一种软件约定(例如,某些寄存器专用于该用途,没有特定的硬件支持)

想想递归定义函数的执行(或解释)(就像天真编码的旧阶乘)。了解 recursion (一般来说,in computer science),primitive recursive functions , lambda calculus , denotational semantics , stack automaton , register allocation , tail calls , continuations , ABI , interrupts , Posix signals , sigaltstack(2) , getcontext(2) , longjmp(3)等等……等等……

另请阅读有关 Computer Architecture 的书籍.在实践中,调用堆栈非常重要,以至于一些硬件资源(包括堆栈指针寄存器,通常是调用帧基指针寄存器,可能还有隐藏的机制,例如缓存相关)专用于普通处理器。

您还可以查看 GCC 编译器使用的中间表示。然后使用 -fdump-tree-allGCC MELT probe .如果查看生成的程序集,请务必将 -S -fverbose-asm 传递给您的 gcc 命令。

另见 linux assembly howto .

我给了很多链接。很难回答得更好,因为我不知道你的背景。

关于c++ - 了解 C/C++ 中函数调用的堆栈框架?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16088040/

相关文章:

c++ - GCC中格式错误的C/C++多维数组初始化

c++ - QueryInterface 因 E_ACCESSDENIED 失败

C++、OpenGL - 渲染大量的……茶壶

C++ : get inherited type from abstract pointer vector

c++ - 读取二进制数据问题

c - 给定基本 block 中的指令位置,如何找到该基本 block ?

c++ - 如何动态生成和运行 native 代码?

c++ - 无需查找的快速独特组合(来自重复列表)

c++ - 汇编最大整数除法

c - 在开始使用方法进行 C 编程时