Итак, я в настоящее время изучаю сборку 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», если оно неверно?