RISC-V基础之函数调用(三)保留寄存器(包含实例)

RISC-V将寄存器分为保留和非保留两类。保留寄存器是指在函数调用前后必须保持相同值的寄存器,因为调用者期望在调用后能够继续使用这些寄存器的值。保留寄存器包括s0到s11(因此称为saved),sp和ra。非保留寄存器,也称为临时寄存器,是指在函数调用中可以自由修改的寄存器,不需要保存和恢复。非保留寄存器包括t0到t6(因此称为temporary)和a0到a7,即参数寄存器。

函数调用时,如果一个函数需要修改保留寄存器的值,那么它必须在修改前将它们保存到堆栈上,并在返回前将它们从堆栈上恢复。这样可以避免破坏调用者的寄存器内容。而如果一个函数只修改非保留寄存器的值,那么它就不需要保存和恢复它们,因为调用者不会再使用它们。

上述代码示例假设所有使用的寄存器(t0,t1和s3)都必须保存和恢复。但是如果调用者没有使用这些寄存器,那么保存和恢复它们就是浪费时间和空间。为了避免这种浪费,如下展示了一个更优化的版本的diffofsums函数,它只保存了s3到堆栈上。t0和t1是非保留寄存器,所以不需要保存。

如果一个函数需要修改保留寄存器的值,那么它必须在修改前将它们保存到堆栈上,并在返回前将它们从堆栈上恢复。这样可以避免破坏调用者的寄存器内容。而如果一个函数只修改非保留寄存器的值,那么它就不需要保存和恢复它们,因为调用者不会再使用它们。

下表总结了哪些寄存器是保留的。一般来说,s0到s11用于存储函数内部的局部变量,所以它们必须被保存。ra也必须被保存,因为它记录了返回地址。t0到t6用于存储临时结果。这些计算通常在函数调用前完成,所以它们不需要被保存,并且很少有情况下调用者需要保存它们。a0到a7经常在函数调用过程中被覆盖。因此,如果调用者在被调用函数返回后还依赖于自己的某些参数,那么它们必须被保存。

更详细的说明可参考操作系统基础知识介绍之指令集体系结构:RISC-V寄存器(掺杂与ARM和X86部分比对)_操作系统的指令集_管二狗赶快去工作!的博客-CSDN博客

堆栈指针sp以上的堆栈空间是自动保留的,只要被调用者不写入sp以上的内存地址。这样可以避免修改其他函数的堆栈帧。堆栈指针本身也是保留的,因为被调用者在返回前会释放自己分配的堆栈帧,即将sp加回与函数开始时相同的值。

相关推荐
乌旭10 小时前
开源GPU架构RISC-V VCIX的深度学习潜力测试:从RTL仿真到MNIST实战
人工智能·深度学习·stable diffusion·架构·aigc·midjourney·risc-v
若风的雨5 天前
RISC-V入门资料
risc-v
禾仔仔7 天前
RISC-V CLINT、PLIC及芯来ECLIC中断机制分析 —— RISC-V中断机制(一)
risc-v·plic·eclic·clic·clint·中断咬尾·中断嵌套
ssslar7 天前
MIT XV6 - 1.6 Lab: Xv6 and Unix utilities -uptime
操作系统·risc-v·xv6
Thomas_Fly7 天前
RISC-V hardfault分析工具,RTTHREAD-RVBACKTRACE
risc-v
sinovoip11 天前
Banana Pi BPI-CM6 是一款八核 RISC-V 模块,兼容 Raspberry Pi CM 载板
risc-v
ssslar12 天前
MIT XV6 - 1.2 Lab: Xv6 and Unix utilities - pingpong
操作系统·risc-v·xv6
乌旭15 天前
算力经济模型研究:从云计算定价到去中心化算力市场设计
人工智能·深度学习·云计算·去中心化·区块链·gpu算力·risc-v
乌旭17 天前
RISC-V GPU架构研究进展:在深度学习推理场景的可行性验证
人工智能·深度学习·架构·transformer·边缘计算·gpu算力·risc-v
ssslar19 天前
MIT XV6 - 1.1 Lab: Xv6 and Unix utilities - sleep 是怎样练成的?
操作系统·risc-v·xv6