到目前为止,我一直使用寄存器$ s0- $ s9和寄存器$ t0- $ t9相同.我被告知并阅读了无数的论坛帖子和段落,并在Google上解释了这些差异,但没有编码示例.我被告知我应该看到它与使用程序有什么区别,但是我已经创建了无数个涉及程序的方案,试图找到保存的寄存器与临时寄存器之间的区别但是我失败了.
我想看一个相对简单的例子,其中$ t0-9寄存器与$ s0-9寄存器的作用不同,结果会产生不同的值?
Kon*_*ach 49
临时变量和已保存变量的工作方式没有区别.不同之处在于它们的使用方式,或者更确切地说,它们应该如何使用.
MIPS调用约定指定了如何使用各种寄存器 - $v
寄存器用于函数返回,$a
寄存器用于函数参数,$t
变量是临时调用者保存的寄存器,而$s
寄存器是被调用者保存的.
被调用者和调用者之间的区别如下:在调用函数时,约定保证$s
寄存器在返回后是相同的,而约定不保证$t
寄存器的这个.当然,这意味着如果您希望$s
在例程中使用寄存器,则必须保存并恢复其值.例如,如果函数的使用寄存器$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
Run Code Online (Sandbox Code Playgroud)
这个链接看起来像一些体面的更深入的信息.
当然,所有这些只是一个约定,因此它只有在您和其他程序通过保存和恢复$s
寄存器来遵守约定时才有效,这样它们就不会被函数调用覆盖.