如何在MIPS中避免在循环内硬编码数组索引/索引?

时间:2013-03-27 06:05:54

标签: arrays loops assembly mips addressing

例如,

$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)等。

谢谢。

1 个答案:

答案 0 :(得分: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)。为了对数字进行平方,你只需将它乘以