2009-11-05 169 views
1

MIPS寄存器有一个约定 - 跨子程序调用保留$ s寄存器,所以如果你的子程序修改它们,它应该将它们保存到堆栈,而$ t寄存器不被保留。

现在,系统调用可以修改$ t寄存器吗?在我有的模拟器中,它不会,但真正的机器可能会改变$ t寄存器吗?我问,因为我想知道 是否可以安全地假设$ t寄存器在系统调用中保持不变。

+2

什么操作系统?它不依赖于特定操作系统的实现吗? – 2009-11-05 06:01:37

回答

2

这是不明智的,除非有记录,依靠任何调用保持特定的寄存器。

如果系统调用的doco声明它只修改某些寄存器,那么这是与您的代码的契约。如果它违反了合同,这是一个错误(尽管你可能更容易修复你自己的代码而不是等待开发者)。如果没有说明这一点,不要依赖它,约定或其他。

写得好的调用将保留全部寄存器,这些寄存器并非专门用于返回您的信息。但是,如果您不确定,并且您需要保存该寄存器,请在调用系统调用之前自行完成。

1

现在,系统调用可以修改$ t寄存器吗?

是的!

当然,您的操作系统的系统调用接口可能会保留所有这些寄存器。但没有技术上的原因,为什么系统调用不能修改它们。检查您的操作系统的文档。