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

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

main:
 li $t1,15         #load 15 into $t1

 la $a1,array      #load a pointer to array into $a1

У меня петля:

addi $t1,$t1,-1

li $v0,4

la $a0,prompt

syscall

person Community    schedule 29.04.2009    source источник
comment
С какой частью у вас проблемы? Похоже, вы уже начали, так что это хорошо. Этот цикл действительно повторяется? Я бы начал с этого. Вы умеете читать ввод с клавиатуры? Это хороший следующий шаг. Вы знаете, как сохранить значение в массиве? Вы умеете сравнивать одно значение с другим?   -  person Rob Kennedy    schedule 30.04.2009
comment
Также помните, что вы или ваши родители ПЛАТИТЕ за то, чтобы ваш инструктор помог вам, поэтому вы можете воспользоваться этой привилегией; ваш инструктор точно знает, как должен выглядеть правильный ответ, и может направить вас туда более прямо, чем люди здесь.   -  person Rob Kennedy    schedule 30.04.2009


Ответы (2)


Я не хочу его отдавать, поэтому приведу несколько рекомендаций.

Вам следует прочитать Ассемблеры, компоновщики и симулятор Spim. Это большая помощь.

Итак, вот оно.

Создайте два массива из 15 слов.

 .data
 fail_vector: .word  -1,-1,-1 ...    #15 invalid words 
 passed_vector: .word  -1,-1,-1 ...  #15 invalid words 

Загрузить в некоторый регистр переменную управления циклом.

 li $t1,15
 beq $t1,$zero,END
 addiu $t1,$t1,-1

Теперь внутри этого цикла считываем значения

 syscall...     #SYS_READ

Затем прочтите это значение (предположим, что оно находится в регистре t4) и решите, хранить ли его в векторе сбоя или передать вектор.

     addiu t4,t4,-50     #subtract 50 from input value. 
     blez  t4,FAILED     #If its lower than 0, then read value is lower than 50 ->FAIL
PASSED:
     #STORE VALUE INTO passed_vector

FAILED:
     #STORE VALUE INTO failed_vector

Когда вы закончите со всеми 15 значениями, распечатайте векторы. Это довольно сложно. Перед использованием вашей программы вы должны заполнить оба вектора неким недопустимым значением, например -1. Поэтому, когда вы печатаете вектор на экран, вы должны остановиться, когда обнаружите одно из этих недопустимых значений. И пока вы это делаете, ведите счетчик, чтобы показать, сколько сдано / не выполнено.

В псевдокоде

for both arrays
   for (i in (0,15) and array[i] not -1)
        print array[i]
        add 1 to scores count //to count passed - failed test scores.

сборка (заполняем пробелы)

END:
     li $t4,15
     li $t1,0
     beq $t1,$t4,EXIT   #condition. While ( i < 15) kind of thing.
     addiu $t1,$t1,-1

     #print out vectors and keep count on other registers
     #then print them out.

     syscall... #SYS_WRITE

EXIT: #exit syscall here.

Еще одна сложная проблема - индексация этих векторов. Поскольку они представляют собой массивы слов, вам следует умножить на 4 (при условии 32-битных слов) переменную управления циклом (классическая переменная i в C), чтобы проиндексировать вектор. Если бы они были байтовыми массивами, умножение не потребовалось бы. И если бы они были короткими массивами ... (ну, вы меня поняли)

Например:

passed_vector[i] #(C style sintax)

и пусть переменная i хранится в регистре $ t1, получится так:

  sll $t2,$t1,2             #i * sizeof(word)
  la  $a0,passed_vector     #$a0 points to passed_vector
  add $a0,$a0,$t2           #$a0 now points to passed_vector + i   

Итак, теперь вы можете загружать / сохранять в переданный_вектор [i]

  sw  $t3,0($a0)            #0($a0) is passed_vector[0]
  lw  $t3,0($a0)

Один из способов решения подобных задач (то есть написания на ассемблере) - написать программу на C (или другом известном вам языке), а затем перевести ее на ассемблер, инструкция за инструкцией.

person Tom    schedule 29.04.2009
comment
Я запутался, но что, если я дам программу на C, вы сможете перевести ее мне в программу MIP? - person ; 30.04.2009

Хорошо, вот как загрузить оба целочисленных массива (и только это)

.data
#These are two integer arrays. Each position is 32 bits long.
passed_vector: .word -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1
failed_vector: .word -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1

.text

         #
         # Previous code here.
         #

         li $t5,50             #For comparing test_scores against.

         li $t0,0              # for (0..15)
         li $t6,15             #

LOOP:    beq $t0,$t6,CONTINUE  # loops while i<15


         li  $v0,5
         syscall      
         move $t1,$v0           #read test score and move it to register $t1

         bge $t1,$t5,PASSED    #if score >=50, load into passed_vector
FAILED:                        # else: test score lower than 50. Loads into failed vector

         #dont forget to increment the failed counter here
         sll $t2,$t0,2         
         sw  $t1,failed_vector($t2) 

         addiu $t0,$t0,1       #i++
         b     LOOP

PASSED:

         #dont forget to increment the passed counter here.
         sll $t2,$t0,2         
         sw  $t1,passed_vector($t2) 

         addiu $t0,$t0,1       #i++
         b     LOOP

CONTINUE: #other code
person Tom    schedule 01.05.2009