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

时间:2013-11-21 02:29:03

标签: assembly mips

到目前为止,我一直使用寄存器$ s0- $ s9和寄存器$ t0- $ t9相同。我被告知并阅读了无数的论坛帖子和段落,并在Google上解释了这些差异,但没有编码示例。我被告知我应该看到它与使用程序有什么区别,但是我已经创建了无数个涉及程序的场景,试图找到保存的寄存器与临时寄存器之间的区别,但我失败了。

我想看一个相对简单的例子,其中$ t0-9寄存器与$ s0-9寄存器的作用不同,结果产生不同的值? < / p>

1 个答案:

答案 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>