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

sha*_*n a 25 assembly mips

到目前为止,我一直使用寄存器$ 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寄存器来遵守约定时才有效,这样它们就不会被函数调用覆盖.

  • 要回复发布者对 $t 的行为与 $s 不同的“相对简单的示例”的请求,您可以添加 myFunction 的定义:`addi $t0, $0, 255` `jr $ra`。 (2认同)
  • 我喜欢术语 *call-preserved* 与 *call-clobbered*。这避免暗示任何人如果不关心寄存器的值或无论如何都不会修改它们,就必须对寄存器进行任何保存/恢复。正常情况是,您将调用破坏的寄存器用于下一次函数调用后不需要的值,因此可以让这些值消亡,并考虑在函数调用后寄存器/值消亡。此外,术语相差不止一个字母,并从相同的角度(当前使用它们的功能)谈论这两种寄存器。 (2认同)