Mips элементы массива - PullRequest
       6

Mips элементы массива

0 голосов
/ 11 апреля 2019

Мне дают:

$ a0 = адрес массива

$ a1 = размер этого массива

Я должен вернуться:

$ v0 = макс.

$ v1 = позиция максимума (индексирование на основе 1)

Мой код работает, как и предполагалось, для размера массива = 0, но не проходит все остальные тесты, возвращая max = {первый элемент}, позицию = 1 каждый раз.

maxAndArg:

        li $v0, -2147483648       # $v0(MAX) is the smallest negative number 
        li $v1, 0                 # $v1(POSITION) starts from zero
        li $t3, 0                 # $t3(i in a normal language) will be used to loop
        li $t4, 0                 # $t4 will be used to show the position in the array 
L1:

        beq $t3,$a1,EXIT          # if (i = arrsize) goto EXIT

        sll $t4,$t4,2             # $t4 = $t4 * 4

        add $t5,$a0,$t4           # $t5 now has the ADDRESS of the $t4 element

        lw $t5,0($t5)             # $t5 now has the VALUE of the $t4 element

        ble $v0,$t5,L2            # if (max =< a[$t4]) goto L2

        srl $t4,$t4,2             # $t4 = $t4 / 4 (Original value)

        addi $t4,$t4,1            # $t4 = $t4 + 1

        addi $t3,$t3,1            # $t3 = $t3 + 1 ((i++))


        j L1
L2:

        add $v0,$t5,0             # max = $t5

        add $v1,$t3,1             # position = $t3
EXIT:

        jr     $ra                #return

1 Ответ

0 голосов
/ 11 апреля 2019

Когда выполнение входит в L2, оно не возвращается в цикл, а просто существует на первой итерации.Вы можете либо вернуться назад после ввода L2, используя метку после инструкции ble, либо изменить ее на bgt и пропустить код, как if, который будет работать на языке более высокого уровня.

    ...
    lw $t5,0($t5)             # $t5 now has the VALUE of the $t4 element
    bgt $v0,$t5,L2            # if (max > a[$t4]) goto L2

    # this below will only be executed if a[$t4] >= max
    add $v0,$t5,0             # max = $t5
    add $v1,$t3,1             # position = $t3

L2:
    # else or finally, continuing loop...
    srl $t4,$t4,2             # $t4 = $t4 / 4 (Original value)
    ...
...