Максимальное значение массива в сборке MIPs - PullRequest
2 голосов
/ 30 января 2020

Итак, я в настоящее время изучаю сборку MIPs впервые, и одна из моих задач - найти максимальное значение со знаком в данном массиве, используя только условные команды 'beq' и 'slt'. Однако, когда я запускаю программу, регистр, который содержит значение MAX, всегда становится равным нулю, когда он должен быть -4. Вот этот массив: {-32, -8, -4, -16, -128, -64} А вот и мой код. Код, который выполняет значение MAX, работает от L2 до L4. Проигнорируйте L1 и L5, как это было предоставлено, и все, что я сделал, это изменил метки на них.

# local variable    register
#   int *p      $s0            can ignore this
#   int *end    $s1            Last element in array
#   int sum     $s2            can ignore this
#   int max     $s3            name of MAX register!
#   int *q      $s4            pointer to abc
#   abc                        the name of the array


main:
    la  $s0, abc                # p = abc
    addi $s1, $s0, 24            # end = p + 6
    add $s2, $zero, $zero     # sum = 0 
L1:
    beq $s0, $s1, L2             # if (p == end) goto L2
    lw  $t9, ($s0)           # $t9 = *p
    add $s2, $s2, $t9         # sum += $t9
    addi $s0, $s0, 4             # p++
    j   L1
L2:     
    la  $s4, abc                #q = abc. This is where my portion of the code starts
    lw  $t1, ($s4)           #putting p[1] into t1
    add $s3, $zero, $t1       #setting p[1] as max by default
    j   L3  

L3:
    beq     $s4, $s1, L5        #if p goes to end, goto L5
    addi    $s4, $s4, 4     #advancing p[i]
    lw  $t8, ($s4)          #putting p[i] into t8
    add $s5, $zero, $t8
    slt $t0, $s3, $t8       #if t1 < t8, t0 becomes one
    bne $t0, $zero, L4     #if if t0 = zer0, or in other words t1 < t8, goto L4
    j   L3
L4:
    add $s3, $zero, $s5     #storing t8/s5 into max
    j   L3

L5:
    add $v0, $zero, $zero   # return value from main = 0
    jr  $ra

Когда я запускаю свой код шаг за шагом, FINAL JUMP ОТ L4 к L3, кажется, устанавливает регистр $ s3 до нуля. но что еще более запутанно, он держит «-64» прямо перед этим. Итак, в основном я спрашиваю, какая ошибка в моем коде сбрасывает $ s3 в ноль? Почему $ s3 имеет «-64», если оно неверно?

...