【问题标题】:MIPS: How to increment stack pointer?MIPS:如何增加堆栈指针?
【发布时间】:2019-12-13 03:37:41
【问题描述】:

我正在尝试创建一个 MIPS 程序,用户可以在其中设置他们想要输入的输入值的数量(最多 5 个值),然后输入这些值。

为此,我想使用一个循环来提示用户将值输入控制台,然后将该值从 $v0 移动到堆栈中。但我不确定如何在循环内增加堆栈指针。我最初尝试过类似的东西:

# Initialize t6 to zero, this is stack pointer value
add $t6, $zero, $zero

# Initialize stack to hold 5 register values
addi $sp, $sp, -20

# Load register value into stack
sw $vo, $t6($sp)

然后每次迭代将我的堆栈指针值增加 4。但我得到一个 '"$t6": 操作数类型不正确' 错误。有没有办法在循环内增加堆栈指针值?

是的,我确实知道我可以使用数组来做到这一点,但我正在尝试练习,以便我可以学会正确使用堆栈。提前感谢您的帮助!

【问题讨论】:

    标签: assembly stack mips


    【解决方案1】:

    Erik 解释了问题和几个可能的解决方案。这是另一种解决方案。

    不要将 $t6 初始化为 0,而是将其初始化为 $sp。

    addi $sp, $sp, -20
    add $t6, $sp, $zero
    

    然后就可以写到$t6中的地址了。

    sw $vo, ($t6)
    

    每次迭代将 $t6 增加 4,就像您现在所做的那样。

    如果您需要在 5 个值后终止循环,请使用另一个寄存器作为计数器,或者

    add $t7, $t6, 20
    

    然后在 $t6 等于 $t7 时退出循环。

    【讨论】:

      【解决方案2】:

      MIPS 没有寄存器+寄存器寻址模式——它只有立即数+寄存器。如果要计算寄存器 + 寄存器(或寄存器 + 寄存器 * scaleFactor),则必须使用多条指令。


      您可以使用以下代码序列将一个值动态压入堆栈:

      add $sp, $sp, -4
      sw $xx, 0($sp)
      

      这会分配一个字的堆栈空间,然后用 xx 初始化它(无论寄存器 xx 是什么)。可以根据需要为其他项目重复此代码序列。

      每当您将某些东西压入堆栈时,已经在堆栈上的东西会变得更远,因此在上述代码序列之前位于8($sp) 的值现在位于12($sp)

      只有当您静态知道有多少项目进入堆栈(或至少知道堆栈中项目的最大数量)时,您才能进行批量分配(例如add $sp, $sp, -20,然后使用您的插槽' ve 已分配——这就像在堆栈上分配一个固定大小的数组(其中固定大小在编译时已知),然后使用它(或其中一些)。

      如果您不知道静态项目的数量,那么您可以按照上述方式一次动态推送一个。


      (当然,如果你要压入堆栈的项目实际上是 20 字节大,那么你可以重复这样做。)


      我们还可以索引到堆栈上的固定大小的数组。这需要计算指向数组的基指针,并按元素大小递增/递减指针,或者通过按元素大小缩放索引并添加到​​数组的基指针来索引数组。这两种方法都需要一些关于 MIPS 的指令,而不是单一的复杂寻址模式。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-01-20
        • 2015-11-16
        • 2013-07-26
        • 1970-01-01
        相关资源
        最近更新 更多