【问题标题】:How do I avoid hard coding array index/indices within a loop in MIPS?如何避免在 MIPS 的循环中硬编码数组索引/索引?
【发布时间】:2013-03-27 06:05:53
【问题描述】:

例如,

$a0 is an index/pointer
$a1 is the address of the array base

我想在循环中访问数组的每个元素,对该元素执行算术运算,然后将其保存到下一个。索引应该在每次迭代中增加 +1。

举个简单的例子,我试图对数组中的每个前一个元素求平方。初始硬编码值为 INDEX[0]=0,ARRAY[0]=2。我已经标记了我感到困惑的地方。我不知道如何为每个循环制作这个变量。

       .data
INDEX: .space  4
       .align  2
ARRAY: .space  16
       .align  2

       .text
        la     $a0, INDEX
        la     $a1, ARRAY
        li     $t0, 0
        sw     $t0, ($a0)       # set INDEX[0]=0
        li     $t0, 2
        sw     $t0, ($a1)       # set ARRAY[0]=2

LOOP:
        lw     $t0, ($a0)
        sll    $t0, $t0, 2      # $a0 * 4 to get element offset
        lw     $t1, $t0($a1)    # STUCK HERE (1)
        add    $t1, $t1, $t1    # square
        lw     $t0, ($a0)
        add    $t0, $t0, 1
        sw     $t1, $t0($a1)    # AND HERE (2)
        add    $a0, $a0, 1

               ... keep looping if space remaining in $a1

(1) 如何保存元素 ARRAY[INDEX] 以注册 $t1 而无需硬编码偏移量?

(2) 如何将更改后的寄存器 $t1 保存到数组中的特定元素:ARRAY[INDEX] = $t1

由于间接寻址会在每个循环中发生变化,我想避免使用 4($a1)、8($a1) 等。

谢谢。

【问题讨论】:

    标签: arrays loops assembly mips addressing


    【解决方案1】:

    你需要把基地址和索引加在一起。像这样的东西应该可以工作:

        sll    $t2, $t0, 2      # $a0 * 4 to get element offset
        add    $t2, $t2, $a1    # Add the array base address to the scaled index
        lw     $t1, ($t2)       # $t1 = ARRAY[index]
        add    $t1, $t1, $t1    # square
        add    $t0, $t0, 1
        sw     $t1, ($t2)       
    

    请注意,您实际上并不是在对数字进行平方 - 您是在将它们加倍 (t1 = t1 + t1)。要对一个数字求平方,您可以它本身。

    【讨论】:

    • 感谢您的解决方案。当我完成这个时,我会告诉你进展如何。我实际上是在做斐波那契而不是平方,所以这需要我更长的时间才能弄清楚。
    • 当我使用 ARRAY[INDEX] 加载我的一个寄存器时出现地址超出范围错误,但它肯定是我的代码中的其他内容。我会继续解决它。导致错误的行是: lw $t1, ($t2)
    • 使用调试器检查索引并确保在索引达到数组大小除以每个元素大小时退出循环。
    猜你喜欢
    • 2017-06-24
    • 2012-12-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-08-16
    • 1970-01-01
    • 2013-01-11
    • 1970-01-01
    相关资源
    最近更新 更多