堆栈中的返回地址是如何指定的?
堆栈
堆栈是一种线性数据结构,其中的元素被访问的一端被称为堆栈的**"顶"**。它遵循LIFO(先进先出)的方法。
程序计数器
程序计数器是CPU中的一个特殊用途的寄存器,用于存储下一条指令的内存位置。
**注意:**本文使用缩写形式 "PC"来代替程序计数器。
堆栈指针
堆栈指针是CPU中的一个特殊寄存器,用来存储堆栈中最顶端元素的地址。
什么时候以及如何在堆栈中指定返回地址?
- 当一个程序包含一个函数调用或子程序时,返回地址在堆栈中被指定。
- 当函数被调用时,在其完全执行后,它必须返回到原始程序,即程序中函数调用后的下一条指令。
- 当函数调用要被执行时,程序计数器PC持有程序中函数调用后下一条指令的地址。
- 为了执行函数,控制必须进入函数定义,执行完函数后,必须返回到程序中函数调用后的下一条指令。
- 因此,当函数被执行时,PC值,即下一条指令的地址被存储到堆栈中(SP增量),PC被存储函数的地址更新。
- 在函数执行完毕后,PC会被堆栈中的返回地址更新(堆栈顶部的值)。
例子:
假设I3是一个函数调用指令,CPU目前正在执行I3,PC=304。
- PC值304被存储到堆栈中,堆栈指针SP被增加1。
- PC值被更新为400,即存储函数的地址。
- 在函数执行完毕后,PC值再次被堆栈值更新(堆栈顶部),堆栈指针SP减去1。
为了更好的理解,请看下面的图片