需要帮助在 MIPS 中实现阵列



我正在尝试理解MIPS中的数组。我知道您需要将堆栈指针向前移动一个单词或向后移动(增量为 4)。但我不知道如何将这个想法实现到MIPS代码中。

 j = 0
 x = a[j+k]
 a[j+k] = a[j]

我所知道的是将 0 加载到寄存器中 (j=0),然后我认为您将基址 word 加载 $a 0 并生成 a[j],然后在将该值 sw 到 0($a 0) 之前将 k 添加到它。

li $t0, 0       
lw $t0 0($a0)
add $t0, $t0, $a2
sw $t0, ($a0)

我们被分配将此代码转换为MIPS,而前一部分是它的第一部分。

# Register usage
# $a0 = base address of array
# $a1 = n, size of array
# $a2 = k, the shift amount
# j = 0
# x = a[j+k]
# a[j+k] = a[j]
# repeat n-1 times
#   j = (j+k) mod n
#   m = (j+k) mod n
#   y = a[m]
#   a[m] = x
#   x = y
# end repeat

我的问题是如何在MIPS中进行n-1次循环? 这是一个条件,那么只是

subi $a1 $a1

最后如何找到模组?我相信是div,然后是$HI。这就是我目前所拥有的。

add $t1, $t0, $a2    #j+k
div $t1, $a1         #divide (j+k) by n
mfhi $t2             #move rem into t2
move $t2, $t0        #j = (j+k) mod n
add $t1, $t0, $a2    #j+k
div $t1, $a1         #divide (j+k) by n
mfhi $t2             #move rem into t2
move $t2, $t0        #m = (j+k) mod n
sw $t0, 0($t0)
lw $t3, 0($t0)

我相信我自己很困惑。如能作出澄清,将不胜感激。

li $t3, 0       #j = 0
lw $t3, 0($a0)     #load the value of @a0 in to j
add $t3, $t3, $a2  # j = j+k
sw $t3, 4($a0)     # store the new value of j in to $a0
loop:
beq $a1, $zero, return
sub $a1, $a1, 1      #n = n-1
add $t4, $t3, $a2    #j+k
div $t4, $a1         #divide (j+k) by n
mfhi $t5        
move $t5, $t3        #j = (j+k) mod n

 add $t4, $t3, $a2    #j+k
 div $t4, $a1         #divide (j+k) by n
 mfhi $t5             #move rem into t2
 move $t5, $t3        #m = (j+k) mod n
 b loop
return:
sw $t3, 4($a0)
jr $ra
lw $t3, 0($a0)

我在这里看到了你的代码,经过一些修补。我让程序运行,但输出错误,我看到了我在条件中犯的错误,修复它后程序不再返回任何输出。我更改了寄存器。

最新更新