例如,
$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)等。
谢谢。
答案 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)。为了对数字进行平方,你只需将它乘以。