我的数组中的中间元素没有被交换

时间:2013-10-17 07:06:15

标签: assembly mips

过去五个小时我一直试图解决这个问题。我必须将第一个索引与最后一个索引进行比较。如果第一个<最后,他们将被交换。如果我的数组有五个或更少的元素,这可以正常工作。两次迭代后,任何更大的值和交换都会停止。我做错了什么?

我的子程序反转数组:

ReverseArray:
    add $s0, $a0, $0

    li  $t2, 1
    la  $s0, array
    li  $s1, 4
    sub $s2, $t0, 1         #lines 177 - 180 finds the last index of the array
    mult    $s2, $s1
    mflo    $s2
    add $t3, $s2, $s0

    swap:
        lw  $t5, 0($s0)
        lw  $t4, 0($t3)     #stores the element of last index into $t4

        sle $t1, $t5, $t4
        beq $t1, $0, finish

        li  $v0, 1          #only in the loop for debug purposes
        add $a0, $t1, $0
        syscall

        add $t6, $t5, $0
        sw  $t4, 0($s0)
        sw  $t6, 0($t3)

        sub $s2, $s2, 4
        add $t3, $s2, $s0
        add $s0, $s0, 4
        j   swap
    finish:

        add $v1, $s0, $0
        jr  $ra

假设我将这些数字输入到我的数组中:

3 6 9 12 15 18

我得到的是:

18 15 9 12 6 3

1 个答案:

答案 0 :(得分:1)

你的循环的退出条件似乎是第一个元素大于第二个,如果你试图反转数组,这是不对的(你应该比较地址或inidices)。您更新$t3的方式也很奇怪。

这是一个有效的循环:

swap:
    lw  $t5, 0($s0)
    lw  $t4, 0($t3)     #stores the element of last index into $t4

    sw  $t4, 0($s0)
    sw  $t5, 0($t3)

    sub $t3, $t3, 4
    add $s0, $s0, 4
    sle $t1,$t3,$s0
    beq $t1,$0,swap    # repeat until $t3 <= $s0