1

例如,

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

谢谢你。

4

1 回答 1

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)。要平方一个数字,您需要将其乘以它自己。

于 2013-03-27T06:15:45.623 回答