谁负责在 MIPS 中保存 calle-saved 寄存器?

Who is responsible for saving calle-saved registers in MIPS?

当在 MIPS 中调用子程序时,由于调用保存的寄存器 ($s0-$s7) 在 function/subroutine 调用中保留,如果它们要调用,它们将保存在子程序的堆栈帧中被修改。谁负责拯救他们?我是汇编程序员负责通过编写指令将它们存储到堆栈来保存这些调用保存的寄存器吗?还是汇编程序在为我调用子程序时以某种方式自动管理调用保存的寄存器的保存,以便在调用过程中保留它们?我刚刚学习 MIPS 调用约定,所以这对我来说是全新的。

你负责,汇编程序的工作是将你编写的内容转换为机器代码。

你的函数并不一定要保存/恢复它们,你只需要确保它们在你的函数 returns 时仍然有它们的原始值。 最简单的方法是根本不要触及这些寄存器。

调用方与被调用方保存的寄存器是一个令人困惑的术语,并且错误地暗示每次调用函数时都必须将所有寄存器保存在某个地方。

更好的术语:调用保留与调用破坏。 在这两种情况下,您都是从相同的角度查看寄存器,而不是暗示任何人的实际上浪费指令做任何节省。如果在 jal.

之后不需要寄存器中的值,就让寄存器被破坏

你可以使用像 $t0..$t9 这样的调用破坏的寄存器来做任何你想做的事情,你可以 return 用它们保存你的代码后留下的任何垃圾。

如果您在循环内进行函数调用,您可能需要保存几个调用保留寄存器 ($s0..$s7) 并将其中一个用于循环计数器。然后在你的函数结束时恢复它。您不想 store/reload 自己在循环中;如果你调用的函数没有触及寄存器,那将是一个很大的浪费。