私はそれを手放したくないので、いくつかのガイドラインを投げます。
Assemblers, linkers and the Spim simulatorを読む必要があります。とても助かります。
それで、ここに行きます。
15 ワードの配列を 2 つ作成します。
.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.
もう 1 つのトリッキーな問題は、これらのベクトルのインデックス付けです。これらは単語の配列であるため、ループ制御変数 (C の従来の i 変数) に 4 (32 ビット ワードと仮定) を掛けて、ベクトルにインデックスを付ける必要があります。それらがバイト配列である場合、乗算は必要ありません。そして、それらが短い配列である場合...(まあ、あなたは私の主張を理解します)
例えば:
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
これで、passed_vector[i] にロード/ストアできるようになりました
sw $t3,0($a0) #0($a0) is passed_vector[0]
lw $t3,0($a0)
この種の問題 (つまり、アセンブリで記述する) を解決する 1 つの方法は、プログラムを C (またはその他の既知の言語) で記述し、それを命令ごとにアセンブリに変換することです。