Я не хочу его отдавать, поэтому приведу несколько рекомендаций.
Вам следует прочитать Ассемблеры, компоновщики и симулятор 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