【问题标题】:MIPS and $31, can't understand why data is stored in register $31MIPS 和 $31,不明白为什么数据存储在寄存器 $31
【发布时间】:2016-06-26 12:45:25
【问题描述】:

我对 MIPS 了解不多,因为我们明年必须在大学做,但是,今年我们必须使用 lex 和 yacc,当然我们需要了解 MIPS。几个小时前我刚刚学到了一些东西,但是例如,如果我们有 'a=-2' 和 'b=-a',我知道对于 'a=-2' 我们有类似 'addi $1, $0 , -2',对于'b=-a',我们有类似'move $2, $31'的东西。直到这里我才明白,但我想知道一些事情。 $31 是存储“b”的寄存器?如果是的话,那个登记册有什么特别之处?为什么不能存储在 $30 或 $29 中?是因为 $31 是最后一次注册吗?

【问题讨论】:

    标签: mips


    【解决方案1】:

    寄存器分配基于编译器的分配方案,以 mips ABI http://www.cs.uwm.edu/classes/cs315/Bacon/Lecture/HTML/ch05s03.html 为准

    因此,如果您有两个变量:ab,编译器可以将它们分配给任何可用于给定目的的寄存器。寄存器$31 又名$ra 是返回地址寄存器。保留数据值不是一个好的选择,因为$ra 硬连线到jal 指令中。

    $0 又名$zero 被硬连线为零值。其他寄存器可用于任何目的,但大多数编译器和大多数程序都遵守 ABI 的寄存器使用约定。

    因此,$1 aka $at 是“临时汇编程序”。这是因为 mips 仅具有相等/不等式的条件分支指令(例如beq/bne)而没有(例如blt)。所以,它有一个slt指令,它接受一个输出寄存器,一般是$at寄存器

    对于您的序列:

    a = -2;
    b = -a;
    

    假设a 已分配给$t0b 已分配给$t1。生成的序列将是:

        addi    $t0,$zero,-2            # a = -2
        sub     $t1,$zero,$t0           # b = -a
    

    此外,有关$ra 可以做什么和不能做什么的更多信息,请在此处查看我的回答:Whether $ra register callee saved or caller saved in mips?

    【讨论】:

      【解决方案2】:

      MIPS 中的$31 寄存器是返回地址寄存器。它由调用函数保存。保存后即可使用。

      但是没有针对这一点的检查。它可以像任何其他通用寄存器一样用于 lw 指令。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2022-07-12
        • 1970-01-01
        • 2023-03-09
        • 1970-01-01
        • 2022-07-12
        • 2014-11-29
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多