堆栈中如何指定返回地址?

30 阅读2分钟

堆栈中的返回地址是如何指定的?

堆栈

堆栈是一种线性数据结构,其中的元素被访问的一端被称为堆栈的**"顶"**。它遵循LIFO(先进先出)的方法。

程序计数器

程序计数器是CPU中的一个特殊用途的寄存器,用于存储下一条指令的内存位置。

**注意:**本文使用缩写形式 "PC"来代替程序计数器。

堆栈指针

堆栈指针是CPU中的一个特殊寄存器,用来存储堆栈中最顶端元素的地址。

什么时候以及如何在堆栈中指定返回地址?

  • 当一个程序包含一个函数调用或子程序时,返回地址在堆栈中被指定。
  • 当函数被调用时,在其完全执行后,它必须返回到原始程序,即程序中函数调用后的下一条指令。
  • 当函数调用要被执行时,程序计数器PC持有程序中函数调用后下一条指令的地址。
  • 为了执行函数,控制必须进入函数定义,执行完函数后,必须返回到程序中函数调用后的下一条指令。
  • 因此,当函数被执行时,PC值,即下一条指令的地址被存储到堆栈中(SP增量),PC被存储函数的地址更新。
  • 在函数执行完毕后,PC会被堆栈中的返回地址更新(堆栈顶部的值)。

例子:

假设I3是一个函数调用指令,CPU目前正在执行I3PC=304

  • PC值304被存储到堆栈中,堆栈指针SP被增加1。
  • PC值被更新为400,即存储函数的地址。
  • 在函数执行完毕后,PC值再次被堆栈值更新(堆栈顶部),堆栈指针SP减去1。

为了更好的理解,请看下面的图片

Example showing storing of return address