到目前为止,我一直使用寄存器$ s0- $ s9和寄存器$ t0- $ t9相同。我被告知并阅读了无数的论坛帖子和段落,并在Google上解释了这些差异,但没有编码示例。我被告知我应该看到它与使用程序有什么区别,但是我已经创建了无数个涉及程序的场景,试图找到保存的寄存器与临时寄存器之间的区别,但我失败了。
我想看一个相对简单的例子,其中$ t0-9寄存器与$ s0-9寄存器的作用不同,结果产生不同的值? < / p>
答案 0 :(得分:43)
临时变量和已保存变量的工作方式没有区别。不同之处在于如何使用它们,或者更确切地说,它们应该如何使用。
MIPS调用约定指定了如何使用各种寄存器 - $v
寄存器用于函数返回,$a
寄存器用于函数参数,$t
变量是临时调用者保存寄存器,而$s
寄存器被调用者保存。
callee和caller保存的区别如下:调用函数时,约定保证返回后$s
寄存器相同,而约定不保证$t
寄存器的寄存器。当然,这意味着如果您希望在例程中使用$s
寄存器,则必须保存并恢复其值。例如,如果函数A使用寄存器$t0
和$s0
然后调用函数B,它必须保存寄存器$t0
,如果它想在函数B返回后使用它。功能B必须先保存$s0
才能开始使用它。
一个例子:
main:
li $s0 7
li $t0 7
jal myFunction
#$s0 guaranteed to equal 7
#$t0 value not guaranteed
This link看起来像是一些更为深入的信息。
当然,所有这些只是一个约定,因此它只有在您和其他程序通过保存和恢复$s
寄存器来遵守约定时才有效,这样它们就不会被函数调用覆盖。 / p>