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

时间:2018-05-18 10:32:08

标签: assembly mips calling-convention

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

2 个答案:

答案 0 :(得分:4)

你的功能实际上不需要保存/恢复它们,你只需要确保它们在你的函数返回时仍然有它们的原始值。 最简单的方法是不要触摸这些寄存器。

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

更好的术语:呼叫保留与呼叫破坏。在这两种情况下,您都可以从相同的角度查看寄存器,并且不会暗示任何人'实际上浪费指令进行任何保存。如果你在jal之后不需要它们的价值,就让寄存器被破坏。

您可以使用$t0..$t9之类的call-clobbered寄存器来表达您想要的任何内容,并且可以随身携带代码之后的垃圾回复。

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

答案 1 :(得分:1)

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