到目前为止,我一直在使用寄存器 $s0-$s9 以及与寄存器 $t0-$t9 相同的方式。我被告知并阅读了无数的论坛帖子和段落,在这里和谷歌上解释了差异,但没有编码示例。有人告诉我应该看到它与使用过程有关的差异,但我创建了无数涉及过程的场景,试图找出保存的寄存器与临时寄存器之间的差异,但我失败了。
我想看一个相对简单的示例,其中 $t0-9 寄存器的行为与 $s0-9 寄存器不同,因此会产生不同的值?
最佳答案
临时变量和保存变量的工作方式没有区别。区别在于它们的使用方式,或者更确切地说,它们应该如何使用。
MIPS 调用约定指定如何使用各种寄存器 - $v
寄存器用于函数返回,$a
寄存器用于函数参数,$t
变量是临时调用者保存的寄存器,而 $s
寄存器被调用者保存。
被调用者和保存的调用者之间的区别如下:调用函数时,约定保证 $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
尊重约定时它才有效。寄存器,以便它们不会被函数调用覆盖。
关于assembly - MIPS 汇编语言 - 临时寄存器与保存的寄存器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20111326/