MIPS: определить, является ли список результатов тестов успешным или нет - PullRequest
1 голос
/ 04 мая 2009

Я пишу программу MiPS, которая проверит список из 15 результатов тестов. И он будет вводить из терминала. Ну, критерием прохождения является оценка 50. Выходные сигналы терминала будут включать в себя оценки в каждой категории, а также количество учащихся, прошедших и не прошедших обучение. с подсказками ввода и выводами ... Ниже приведена программа, которую я написал, но она не работала .... Пожалуйста, мне нужно .... Я не знаю, делаю ли я это неправильно ..

.globl main
.text

главный: li $ t0, 0 # счетчик для сдачи оценок la $ t1, pass #pointer для массива pass
li $ t2, 0 # счетчик для неудачных оценок la $ t3, fail #pointer для проходного массива li $ t4, 0 # счетчик операций li $ t5, 0 li $ t6, 0

цикл: li $ v0, 4 # системный вызов для печати строки la $ a0, строка приглашения #load системный вызов

li $v0, 5           #system call for read integer
syscall             #read integer

bltu $v0, 50, else      #if $v0 < 50 branch to else (failing grade)
sw $v0, 0($t1)          #store word in pass array
addi $t1, $t1, 4        #t1 = t1 + 4 (increment pass pointer)
addi $t0, $t0, 1        #t0 = t0 + 1 (increment pass counter)
b l_end             #branch over else statement

еще: sw $ v0, 0 ($ t3) # слово магазина в массиве сбоев addi $ t3, $ t3, 4 # t3 = t3 + 4 (увеличение приращения указателя) addi $ t2, $ t2, 1 # t1 = t1 + 1 (счетчик ошибок приращения)

l_end: addi $ t4, $ t4, 1 # общий счетчик bltu $ t4, 15, цикл # если t4 <= 15 переход к циклу </p>

количество выходных данных

li $v0, 4           #system call for print string
la $a0, o_pasc          #load string
syscall             #output "Number of Passing Scores:

la $v0, 1           #system call for print integer
add $a0, $t0, 0         #load value of pass counter into $a0
syscall             #output value

li $v0, 4           #system call for print string
la $a0, o_fasc          #load string
syscall             #output "Number of Failing Scores: "

la $v0, 1           #system call for print string
add $a0, $t2, 0         #load value of fail counter into $a0
syscall             #output value

выходной проходной балл

li $v0, 4           #setup output   
la $a0, o_pass          #setup text
syscall             #output string o_pass

la $t1, pass            #load address of pass pointer to t1
lw $a0, 0($t1)          #load word at $t1 into $a0
li $v0, 1           #system call for print integer

loop_a: bleu $ t0, $ t5, lp_a_end #if t0 <= t5 переход в lp_a_end системный вызов #output один балл </p>

li $v0, 4           #system call for print string
la $a0, o_coma          #load string
syscall             #ouput comma and space

li $v0, 1           #setup output
addi $t1, $t1, 4        #move pointer down by 1 word
lw $a0, 0($t1)          #move word at pointer into $a0
addi $t5, $t5, 1        #add 1 to counter

b loop_a            #branch to top

lp_a_end:

результаты с ошибками вывода

la $t5, 0           #clear t5 (counter)
li $v0, 4           #setup output
la $a0, o_fail          #setup text
syscall             #output string o_fail

la $t3, fail            #load address for fail pointer into $t3
lw $a0, 0($t3)          #load word at mem addy $t3 into $a0
li $v0, 1           #system call for print integer

loop_b: bleu $ t2, $ t5, lp_b_end #if t2 <= t5 переход в lp_a_end системный вызов #output один балл </p>

li $v0, 4           #system call for print string
la $a0, o_coma          #load string
syscall             #output comma and space

li $v0, 1           #setup output
addi $t3, $t3, 4        #move pointer down by 1 word
lw $a0, 0($t3)          #load word from mem addy $t3 to $a0
addi $t5, $t5, 1        #add 1 to counter

b loop_b            #branch to top

lp_b_end:

конец

li $v0, 4           #setup output
la $a0, o_brk           #setup text
syscall             #output line break

li $v0, 10          #loads 10 to $v0
syscall             #ends program

1 Ответ

3 голосов
/ 04 мая 2009

«Дежа вю - это обычно сбой в Матрице»

Уверен, я видел это вокруг:

Программа MIPS для определения прохождения / отказа для тестовых оценок

РЕДАКТИРОВАТЬ : Несколько советов: попробуйте упростить вещи. Постройте свою программу постепенно. Например, старайтесь избегать системных вызовов, используйте жестко закодированные входы для проверки логики сравнения. Затем перейдите на системные вызовы. Правильно ли вы используете массивы? Я видел, что у вас есть два отдельных счетчика для индексации массива и подсчета элементов внутри него. Я думаю, что это подвержено ошибкам. Возможно, вам следует использовать счетчик для индексации массива (умножив его на 4). Перейдите по ссылке, я буду рад помочь, если появятся какие-то конкретные сомнения.

Мне не очень нравится симулятор SPIM. Я знаю, что многие университеты используют его для своих курсов, но я думаю, что это ошибка, так как это очень ограниченная среда.

ДРУГОЕ РЕДАКТИРОВАНИЕ (по «популярному» требованию) : Я прочитал твой код некоторое время и кое-что заметил.

  • Вы загружаете значения в регистры для сравнения с нулем. Не делайте этого, используйте регистр $ zero.

    li $ t5,0

    li $ t6.0

используются в

bleu $t0,$t5,lp_a_end       #if t0 <= t5 branch to lp_a_end 

должно быть

bleu $t0,$zero,lp_a_end
  • Использование инструкций

    bltu $ v0, 50, иначе #if $ v0 <50 переход к другому (с ошибкой) </p>

инструкции ветви занимают два регистра и метку. Не регистрируется, средний, этикетка

Должно быть:

   li   $t5,50
   bltu $v0,$t5,else

Полагаю, вы напрасно усложняете себя системными вызовами. Почему вы представляете себе результат, когда не можете заставить его работать? В дополнение к этому, как только вы начнете готовиться к системному вызову, выполните его. Не помещайте инструкцию перехода в середину, как в

        la $t3, fail                    #load address for fail pointer into $t3
        lw $a0, 0($t3)                  #load word at mem addy $t3 into $a0
        li $v0, 1        
loop_b: bleu $t2, $t5, lp_b_end         #if t2 <= t5 branch to lp_a_end 
        syscall                         #output single score

Это довольно запутанно. Может быть, вы должны попробовать что-то вроде:

#Is there anything to print in the array? If not, goto lp_b_end
bleu $t2,$zero,lp_b_end

#Ok, we know we are not pointing at an invalid position of the array.       
la $t3, fail                    #load address for fail pointer into $t3
lw $a0, 0($t3)                  #load word at mem addy $t3 into $a0
li $v0, 1 
syscall

Наконец, попробуйте придерживаться соглашения при использовании системных вызовов. Например, используйте регистры $ a0 и $ v0 только для системных вызовов. Не используйте их ни для чего другого. Если вы читаете целое число в $ v0, то перед тем как делать что-либо еще, переместите его в $ t0.

Это все, что я могу думать прямо сейчас. Как кто-то сказал в посте дурака (Роб Кеннеди), попробуйте также спросить вашего инструктора, поэтому ему платят (я не ваш инструктор, просто рука помощи).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...