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

标签 assembly mips

到目前为止,我一直在使用寄存器 $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/

相关文章:

c - 内存损坏使用汇编程序

sockets - 接头组装。连接,读取和写入

使用 sbrk 的 MIPS 动态内存分配

assembly - MIPS:不使用伪代码的 la 指令的等价物?

assembly - MIPS 寄存器 $0 可以用于存储和检索值吗?

Linux 汇编程序错误 "impossible constraint in ‘asm’“

assembly - MIPS 在过程中使用 $s0... 等重新注册并在最后恢复它是否优雅

assembly - MIPS 汇编不支持 '.set noat' 吗?

assembly - 如何在64位Linux系统上执行32位shellcode?

c++ - 程序集 : main:nop vs main proc