我也是 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-all
或 GCC MELT probe .如果查看生成的程序集,请务必将 -S -fverbose-asm
传递给您的 gcc
命令。
另见 linux assembly howto .
我给了很多链接。很难回答得更好,因为我不知道你的背景。