公司网站宣传自己做的灯展,怎么给网站做百度优化,电商有创意名字,高端网站设计图片RISC-V将寄存器分为保留和非保留两类。保留寄存器是指在函数调用前后必须保持相同值的寄存器#xff0c;因为调用者期望在调用后能够继续使用这些寄存器的值。保留寄存器包括s0到s11#xff08;因此称为saved#xff09;#xff0c;sp和ra。非保留寄存器#xff0c;也称为…RISC-V将寄存器分为保留和非保留两类。保留寄存器是指在函数调用前后必须保持相同值的寄存器因为调用者期望在调用后能够继续使用这些寄存器的值。保留寄存器包括s0到s11因此称为savedsp和ra。非保留寄存器也称为临时寄存器是指在函数调用中可以自由修改的寄存器不需要保存和恢复。非保留寄存器包括t0到t6因此称为temporary和a0到a7即参数寄存器。
函数调用时如果一个函数需要修改保留寄存器的值那么它必须在修改前将它们保存到堆栈上并在返回前将它们从堆栈上恢复。这样可以避免破坏调用者的寄存器内容。而如果一个函数只修改非保留寄存器的值那么它就不需要保存和恢复它们因为调用者不会再使用它们。 上述代码示例假设所有使用的寄存器t0t1和s3都必须保存和恢复。但是如果调用者没有使用这些寄存器那么保存和恢复它们就是浪费时间和空间。为了避免这种浪费如下展示了一个更优化的版本的diffofsums函数它只保存了s3到堆栈上。t0和t1是非保留寄存器所以不需要保存。 如果一个函数需要修改保留寄存器的值那么它必须在修改前将它们保存到堆栈上并在返回前将它们从堆栈上恢复。这样可以避免破坏调用者的寄存器内容。而如果一个函数只修改非保留寄存器的值那么它就不需要保存和恢复它们因为调用者不会再使用它们。
下表总结了哪些寄存器是保留的。一般来说s0到s11用于存储函数内部的局部变量所以它们必须被保存。ra也必须被保存因为它记录了返回地址。t0到t6用于存储临时结果。这些计算通常在函数调用前完成所以它们不需要被保存并且很少有情况下调用者需要保存它们。a0到a7经常在函数调用过程中被覆盖。因此如果调用者在被调用函数返回后还依赖于自己的某些参数那么它们必须被保存。 更详细的说明可参考操作系统基础知识介绍之指令集体系结构RISC-V寄存器掺杂与ARM和X86部分比对_操作系统的指令集_管二狗赶快去工作的博客-CSDN博客 堆栈指针sp以上的堆栈空间是自动保留的只要被调用者不写入sp以上的内存地址。这样可以避免修改其他函数的堆栈帧。堆栈指针本身也是保留的因为被调用者在返回前会释放自己分配的堆栈帧即将sp加回与函数开始时相同的值。