我不想放弃它,所以我会提出一些指导方针。
你应该阅读汇编器、链接器和 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.
另一个棘手的问题是这些向量的索引。由于它们是字数组,因此您应该将循环控制变量(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)
解决这类问题(即用汇编语言编写)的一种方法是用 C(或您知道的其他语言)编写程序,然后逐条指令将其翻译成汇编语言。