理解函数的调用的堆栈帧在C / C ++? [关闭](Understanding stack f

2019-08-31 12:28发布

我是新来的C / C ++和汇编郎为好。 这也可能是非常基本的问题。 我想了解栈帧是如何建立和变量(PARAMS)推按什么顺序堆叠? 某些搜索结果显示.... C / C ++编译器做出决定基于一个函数中执行的操作。 对于例如,如果功能是假设由通过INT PARAM和返回(类似于++运算符),它将把功能和局部变量的所有..the PARAM函数中的寄存器和执行另外的1只增加值。 ......不知道哪寄存器用于返回/传值?....如何引用返回? .....差B / W EAX,EBX,ECX和EDX。

请求书/博客/链接或任何种类的材料,了解寄存器,栈和堆引用用于/内置,并在函数调用的破坏....怎么也主要功能是存储? 提前致谢

Answer 1:

你的问题是边界在这里。 程序员可能是一个更好的地方。

一本好书,了解栈等的概念可能是Queinnec的Lisp的小块 (它解释得很好堆栈是做什么用的Lisp)。 此外, SICP是一本好书来读 。

D.Knuth的书籍和MMIX也是很好看的。

仔细阅读维基百科调用堆栈页。

从理论上讲,不需要调用堆栈,以及一些语言和实现(如旧SML / NJ)没有使用任何堆栈(但分配在垃圾回收堆调用帧)。 见A.Appel的旧纸垃圾收集比栈分配的快 (和了解更多关于垃圾回收一般)。

一般C和C ++实现具有堆(和经常使用的硬件堆栈)。 某些C局部变量可能不会有任何的堆栈单元(因为他们都得到了优化,或保持在寄存器)。 有时,一个C局部变量的堆位置可能会改变(编译器会使用一段出现一个呼叫堆栈槽,并且对于相同的局部变量的其它出现另一个呼叫堆栈槽)。 当然,一些临时值可以被编译喜欢你的局部变量(所以留在寄存器中,在一个栈槽然后又一个,等...)。 优化当编译器可以做怪异的招数与变量。

在某些老的机器IBM / 360或I BM Z /系列 ,没有硬件堆栈; C编译器所使用的堆栈是一个软件约定(例如,一些寄存器专用于该使用量,没有特别的硬件支持)

想想一个递归定义的函数(如良好的老阶乘天真地编码)的执行(或解释)。 阅读关于递归 (在一般情况下, 在计算机科学 ), 原始递归函数 , 演算 , 指称语义 , 堆自动机 , 寄存器分配 , 尾调用 , 延续 , ABI , 中断 , Posix的信号 , SIGALTSTACK(2) , 的getContext(2) , longjmp的(3)等....等...

还阅读有关书籍计算机系统结构 。 在实践中,调用堆栈是如此重要,以至于一些硬件资源(包括堆栈指针寄存器,经常调用帧基指针寄存器,以及相关或许隐藏机械如高速缓存)专用于它的共同处理器。

您还可以看看由GCC编译器使用的中间表示。 然后使用-fdump-tree-all或GCC MELT探头 。 如果看生成的汇编一定要通过-S -fverbose-asm到您gcc命令。

又见linux的装配HOWTO 。

我给了很多环节。 这是很难回答的好,因为我没有你的背景的想法。



Answer 2:

我想了解栈帧是如何建立和变量(PARAMS)推按什么顺序叠加么?

这依赖于处理器的架构。 然而,通常,堆栈向低地址的高地址增长(如果我们看一下内存addressses的数值)。 其中的StackFrame是“无论这个函数将在堆栈上”

该“东西”是被放在堆栈上通常是:

  • 返回地址返回给调用函数。
  • 帧指针,指向堆栈帧在呼叫的开始。
  • 需要保存的寄存器被“保留”为当这个函数返回。
  • 局部变量。
  • 参数在调用堆栈“下一步”功能。

C / C ++编译器做出决定基于函数内执行的操作。 对于例如,如果功能是假设由通过INT PARAM和返回的1只增加值(类似++运算符),它将把所有...函数中的功能和局部变量的寄存器帕拉姆和执行加法....知道哪寄存器用于返回/传值?....如何引用返回?

编译器具有用于参数的传递规则,以及用于常规函数调用[即,不是“内联”的功能],参数总是以相同的顺序传递,在寄存器中的相同组合和堆栈存储器。 如果不是这种情况,编译器必须知道该函数到底是什么,然后才能决定来传递参数。

不同的处理器架构有不同的规则。 X86-32通常具有用于输入参数的一个或两个寄存器,并且通常一个用于返回值寄存器。 X86-64使用多达5个寄存器用于将所述第一五个值的函数。 任何进一步的参数在寄存器中传递。

返回参考是从返回任何其他值没有什么不同。 (返回在这种情况下是所述对象的地址)的值。 在X86-32,返回值在EAX。 在X86-64,返回值是RAX。 在ARM,R0用于返回值。 在29K,R96用于返回值。



文章来源: Understanding stack frame of function call in C/C++? [closed]