Assembly MIPS汇编语言-临时寄存器与保存寄存器

Assembly MIPS汇编语言-临时寄存器与保存寄存器,assembly,mips,Assembly,Mips,到目前为止,我一直在使用寄存器$s0-$s9,使用方式与寄存器$t0-$t9相同。我被告知并阅读了无数的论坛帖子和段落,在这里和谷歌上解释了两者的区别,但没有编码示例。我被告知我应该看到与使用过程相关的差异,但我创建了无数涉及过程的场景,试图找出保存的寄存器与临时寄存器之间的差异,但我失败了 我想看一个相对简单的例子,$t0-9寄存器的作用与$s0-9寄存器不同,因此产生不同的值?临时变量和保存的变量在工作方式上没有区别。区别在于如何使用它们,或者更确切地说,应该如何使用它们 MIPS调用约定指

到目前为止,我一直在使用寄存器$s0-$s9,使用方式与寄存器$t0-$t9相同。我被告知并阅读了无数的论坛帖子和段落,在这里和谷歌上解释了两者的区别,但没有编码示例。我被告知我应该看到与使用过程相关的差异,但我创建了无数涉及过程的场景,试图找出保存的寄存器与临时寄存器之间的差异,但我失败了


我想看一个相对简单的例子,$t0-9寄存器的作用与$s0-9寄存器不同,因此产生不同的值?

临时变量和保存的变量在工作方式上没有区别。区别在于如何使用它们,或者更确切地说,应该如何使用它们

MIPS调用约定指定如何使用各种寄存器--
$v
寄存器用于函数返回,
$a
寄存器用于函数参数,
$t
变量是临时调用方保存的寄存器,
$s
寄存器是被调用方保存的寄存器

被调用方和保存的调用方之间的区别如下:调用函数时,约定保证
$s
寄存器在返回后相同,而约定不保证
$t
寄存器相同。当然,这意味着如果您希望在例程中使用
$s
寄存器,则必须保存并恢复它们的值。例如,如果函数A使用寄存器
$t0
$s0
,然后调用函数B,那么如果它想在函数B返回后使用它,它必须保存寄存器
$t0
。函数B必须先保存
$s0
,然后才能开始使用它

例如:

main:

    li $s0 7
    li $t0 7

    jal myFunction

    #$s0 guaranteed to equal 7
    #$t0 value not guaranteed
看起来有一些更深入的信息


当然,所有这些都只是一种约定,因此,只有当您和其他程序通过保存和恢复
$s
寄存器来遵守约定,从而使它们不会被函数调用覆盖时,它才会起作用。

为了回应海报上关于“相对简单的示例”的请求,$t的行为与$s不同,您可以添加myFunction的定义:
addi$t0,$0255
jr$ra
@RobertB我认为这会让人过于困惑。用户也可以在
myFunction
中自由更改
$s0
的值,只是他们应该在以后将其放回。您所说的“函数B必须先保存$s0,然后才能开始使用它”到底是什么意思。。。你说的节约是什么意思$s0已经是一个保存的值。主函数调用已经“保存”了$s0。我喜欢术语“保留调用”和“关闭调用”。这避免了暗示任何人都必须保存/恢复寄存器,如果他们不关心值,或者无论如何都不会修改它们。通常情况下,在下一个函数调用之后,您将使用调用CalbBRE寄存器,这样就可以让这些值死亡,并且在函数调用之后考虑寄存器/值已经死了。此外,这些术语的区别不止一个字母,并且从相同的角度(当前使用它们的函数的角度)讨论这两种寄存器。为什么不仅仅是调用者保存的寄存器?我认为不需要被叫方保存的寄存器。任何人都可以分享一个需要被叫人保存的寄存器的案例吗?