📜  计算机组织中的堆栈框架

📅  最后修改于: 2022-05-13 01:57:02.500000             🧑  作者: Mango

计算机组织中的堆栈框架

堆栈框架:
堆栈是应用程序内存的一部分,用于存储局部变量、函数函数。每当我们的程序中有函数调用时,局部变量和其他函数调用或子例程的内存都会存储在堆栈帧中。每个函数在应用程序内存的堆栈段中都有自己的堆栈帧。

特征 :

  • 堆栈中为函数调用分配的内存仅在函数完成后函数执行时才存在,我们无法访问该函数的变量。
  • 一旦调用函数完成其执行,它的堆栈帧就会被移除,并且被调用函数的执行线程从它离开的那个位置恢复。
  • 堆栈用于存储函数调用,因此当我们在程序中使用大量递归调用时,堆栈内存会被函数调用或子程序耗尽,这可能会导致堆栈溢出,因为堆栈内存是有限的。
  • 每个堆栈帧都维护堆栈指针 (SP) 和帧指针 (FP)。栈指针和帧指针总是指向栈顶。它还维护一个程序计数器 (PC),它指向要执行的下一条指令。
  • 每当进行函数调用时,都会在堆栈段中创建堆栈帧,调用函数给出的参数会在被调用函数的堆栈帧中获得一些内存,并将它们推入被函数的堆栈帧。当它们的执行完成时,它们会从堆栈帧中弹出。并且执行线程在被调用函数中继续。

栈帧结构:
堆栈指针始终指向顶部,帧指针存储子程序整个堆栈帧的地址。子程序或函数的每个堆栈帧包含以下内容。

Stack Frame
Other function calls
Other saved registers 
Local variables
Saved [Frame Pointer]
Of called function
Saved [Link Register]
Of called function
Passed arguments 
Frame pointer (F.P)

子程序的典型堆栈帧。

C++ 中的实现:
让我们考虑一个示例程序,以更好地理解堆栈帧。

C++
#include 
using namespace std;
  
//product method
int findProduct(int a, int b)
{
    int product = a * b;
    return product;
}
  
//findSum method
int findSum(int a, int b)
{
    int sum = a + b;
    return sum;
}
  
//main function
int main()
{
    int a = 6;
    int b = 6;
      
    //findProduct method called
    int product = findProduct(a, b);
      
    //findSum method called
    int sum = findSum(a, b);
    cout << "Product is :" << product << endl;
    cout << "Sum is :" << sum << endl;
  
    return 0;
}


输出 :

Product is :36
Sum is :12

使用 Stack 的解释:

第1步 :
当 main() 调用 findProduct函数时,会创建一个新的堆栈帧,如下所示。

findProduct()

 a = 6 
 b=6

product = a* b

 
 
 main()
  a = 6             
  b=6
product = call to findProduct()
sum = call to findSum()

第2步 :
在函数findProduct 完成其指令并返回 main() 后,findProduct 的堆栈帧从堆栈中弹出。之后 main() 调用 findSum()函数。

findSum()
a = 6  
b=6
sum = a+ b
 
 

  main() 

    a = 6  
    b=6
   product = 36 
  sum = call to findSum()

第 3 步:
在函数findSum 完成其指令并返回到 main() 之后,findSum() 从堆栈中弹出,如下所示。

  main()
   a = 6  
   b=6   
  product = 36 
  sum = 12

第4步 :
现在 main()函数执行剩余的语句并从堆栈中弹出,堆栈为空..