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

4
我想循环遍历一个数字数组,如下所示:
.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个回答

2
要做到这一点,您需要首先访问每个数组的第一个元素,然后循环直到指针(或内存地址)超出数组的范围。 数组的地址也是第一个元素的地址(偏移量为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可能会引发异常。


指针增量直到 p == endp 是好的,但是你可以在底部使用 bne $t0, $t1, L1 来完成,而不需要在同一个循环中需要 beq j - Peter Cordes

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接