Проблема с ветвлением MIPS

Я делаю проект в MIPS; мы могли создать все, что захотим, если это соответствовало определенным требованиям. Так или иначе, я решил сделать викторину, что было сложно, но не невозможно. Столкнулся с проблемой сегодня с моим ветвлением.

incrEScore:

    add     $t9, $t9, 1             #increment incr. counter
    add     $t8, $t8, 1             #increment counter
    move    $v0, $t8                    #move to $v0

    beq     $v0, $s2, eQTwo         #counter=2, question 2
    beq     $v0, $s3, eQThree           #counter=3, question 3
    beq     $v0, $s4, eQFour            #counter=4, question 4
    beq     $v0, $s5, eQFive            #counter=5, question 5
    bgt     $v0, $t8, eTally            #counter>5, eTally

decrEScore:

    add     $a3, $a3, 1             #increment decr. counter
    add     $t8, $t8, 1             #increment counter
    move    $v0, $t8                    #move to $v0

    beq     $v0, $s2, eQTwo         #counter=2, question 2
    beq     $v0, $s3, eQThree           #counter=3, question 3
    beq     $v0, $s4, eQFour            #counter=4, question 4
    beq     $v0, $s5, eQFive            #counter=5, question 5
    bgt     $v0, $t8, eTally            #counter>5, eTally

eTally:

    beq     $t9, $s5, eWin          #if increment counter = 5, branch to Easy Win
    bltu    $a3, $s5, eLoss         #if decrement counter < 5, branch to Easy Loss

Переменные, инициализированные в моей основной:

    li  $s0, 0                      #init score
    li  $s1, 1                      #constant; menu num; answer num
    li  $s2, 2                      #constant; menu num; answer num
    li  $s3, 3                      #constant; menu num; answer num
    li  $s4, 4                      #constant; menu num; answer num
    li  $s5, 5                      #constant; counter compare point
    li  $s6, 6                      #constant
    li  $s7, 7                      #constant
    li  $t0, 8                      #constant
    li  $t1, 9                      #constant
    li  $t2, 10                 #constant; counter compare point
    li  $t3, 11                 #constant
    li  $t4, 12                 #constant
    li  $t5, 13                 #constant
    li  $t6, 14                 #constant
    li  $t7, 15                 #constant; counter compare point
    li  $t8, 0                      #question counter
    li  $t9, 0                      #increment counter
    li  $a3, 0                      #decrement counter
    li  $a1, 100                    #constant

Проблема, которая возникает, заключается в том, что вместо того, чтобы все вопросы (это eQNums) выполнялись своим курсом, а счетчик полностью увеличивался или уменьшался, если в любой момент один вопрос неверен, eTally немедленно ответит на проигрыш. Это приводит к тому, что остальные вопросы отключаются/не запускаются, а главное меню снова появляется. Я попытался сделать «blt» вместо «bltu», а также попытался использовать только счетчик приращения вместо счетчиков приращения и уменьшения, но обнаружил, что ни один из них не решает проблему.

Код занимает почти тысячу строк, поэтому вот ссылка на полный исходный код. Легкая секция — это строки со 165 по 299.


person Sam C.    schedule 14.04.2015    source источник
comment
Просто дикая догадка, но вы учли слот задержки перехода?   -  person Seva Alekseyev    schedule 14.04.2015
comment
Используйте симулятор, чтобы пройтись по коду и посмотреть, где что-то пойдет не так. Там есть несколько очень подозрительных ветвей, например, строки 240 и 252 всегда будут ложными, так как v0 был инициализирован из t8.   -  person Jester    schedule 14.04.2015


Ответы (1)


Разобрался с небольшой помощью! Шутка, ты был прав - $t8 был инициализирован 0 вместо 1, и это сбрасывало все!

person Sam C.    schedule 14.04.2015
comment
И да, $s5 должен был быть там, где $t8 был в строках 240 и 252. - person Sam C.; 14.04.2015