金阊公司网站建设电话,河南省住房和建设厅网站首页,株洲手机网站建设,西安视频拍摄制作公司堆栈是一种后进先出#xff08;LIFO#xff09;的队列#xff0c;用于存储函数调用时的临时数据和现场数据。堆栈指针sp#xff08;寄存器2#xff09;是一个普通的RISC-V寄存器#xff0c;按照惯例#xff0c;指向堆栈的顶部。堆栈从高地址向低地址增长#xff0c;即当…堆栈是一种后进先出LIFO的队列用于存储函数调用时的临时数据和现场数据。堆栈指针sp寄存器2是一个普通的RISC-V寄存器按照惯例指向堆栈的顶部。堆栈从高地址向低地址增长即当需要更多的临时空间时堆栈指针sp减小。
函数调用时如果函数参数和局部变量很多寄存器放不下需要开辟堆栈空间存储。中断发生时堆栈空间用于存放当前执行程序的现场数据下一条指令地址、各种缓存数据以便中断结束后恢复现场。开辟和释放堆栈空间的方法是调整堆栈指针sp的值。
函数调用时为了避免函数修改除了a0之外的其他寄存器的值造成主程序的寄存器内容被破坏需要在函数执行前将需要修改的寄存器的值保存到堆栈上然后在函数返回前将它们从堆栈上恢复。具体的步骤是
在堆栈上分配空间来存储一个或多个寄存器的值将寄存器的值存储到堆栈上执行函数使用寄存器从堆栈上恢复寄存器的原始值释放堆栈空间 堆栈通常颠倒存储在存储器中使得堆栈顶部实际上是最低地址并且堆栈向下朝向较低存储器地址增长。 这称为降序堆栈。 一些架构还允许向上的堆栈向更高的内存地址增长。 堆栈指针sp通常指向堆栈上的最顶层元素 这称为全栈。 某些体系结构例如 ARM还允许空堆栈其中 sp 指向堆栈顶部之外的一个字。 RISC-V架构定义了函数传递变量和使用堆栈的标准方式以便不同编译器开发的库可以互操作。 它指定了一个完整的降序堆栈。 RISC-V指定的降序堆栈如下图所示 上图代码示例展示了一个改进的diffofsums函数它在修改t0,t1和s3寄存器之前将它们保存到堆栈上并在返回前将它们从堆栈上恢复。这样可以避免破坏调用者的寄存器内容。
下图展示了在调用代码示例中的diffofsums函数之前期间和之后的堆栈情况。堆栈一开始在0xBEF0F0FC。diffofsums通过将堆栈指针sp减少12来为三个字分配堆栈空间。然后它将t0,t1和s3寄存器中的当前值存储在新分配的空间中。它执行函数的其余部分改变这三个寄存器的值。在函数结束时diffofsums从堆栈上恢复这些寄存器的值释放它的堆栈空间并返回。当函数返回时a0保存了结果但没有其他副作用t0,t1,s3和sp与函数调用前具有相同的值。 一个函数为自己分配的堆栈空间称为它的堆栈帧stack frame。diffofsums的堆栈帧有三个字深。模块化原则告诉我们每个函数只应访问自己的堆栈帧而不是属于其他函数的帧。