使用while循环遍历数组? - MIPS

时间:2011-05-11 16:21:05

标签: arrays loops assembly mips

我想循环遍历数组,如

.word 2,2,2,2,2,2,2,2,2,2,2,2,2
.word 2,2,2,2,2,2,2,2,2,2,2,2,2
.word 2,2,2,2,2,2,2,2,2,2,2,2,2
.word 2,2,2,2,2,2,2,2,2,2,2,2,2

我想确保数组中的所有内容都是值2。 现在这些是52个元素,所以每次我想检查所有数组元素是否都是2 ..其他方面做其他事情。

这就是我到目前为止所做的:

add $t6,$0,$0
add $t7,$0,$0
SL:
addi $t6,$t6,4
addi $t7,$t7,1
la $t1,array
add $t1,$t1,$t6
lw $s0,($t1)
j check

slti $t8,$t7,52
bnez $t8,SL
jr $ra
check:
li $t3,2
seq $t4,$s0,$t3
beqz $t4,do_something
bnez $t4,exit
jr $ra

但是当我制作这样的数组时

   .word 0,2,2,2,2,2,2,0,2,2,2,2,2
   .word 2,2,2,2,2,2,2,2,2,2,2,2,
   .word 2,2,2,2,2,2,2,0,2,2,2,2,2
   .word 2,2,2,2,2,2,2,2,2,2,2,2,0

即使阵列不是全部2,它仍然会退出。

1 个答案:

答案 0 :(得分:1)

为此,您需要先访问每个数组的第一个元素,然后循环,直到指针(或内存地址)超出数组范围。数组的地址也是第一个元素的地址(并且偏移量为0位),最后一个元素的偏移量为48位。

设$ t0为当前元素的地址,$ t1超出范围。

la    $t0, array
addiu $t1, $t0, 52  # 52 is outside the array
L1: 
beq   $t0, t1, L2
# do something here
addiu  $t0, $t0, 4
j     L1
L2:
# this part of the code happens after you traverse through an array.

此外,您可以使用addi而不是addiu,但正如您稍后可能会在课程中学到的那样,addi可能会导致异常。