我正在编写一个MiPS程序,该程序将检查15个测试分数的列表。它将从终端输入。好的,通过标准是50分。终端的输出将包括每个类别的分数和通过和失败的学生数量。输入提示和输出语句...下面是我写的程序,但它没有工作....请我需要....我不知道我做错了..
.globl main
.text
主:
li $ t0,0 #counter通过成绩
la $ t1,传递#pointer传递数组
li $ t2,0 #counter失败成绩
la $ t3,pass #pointer for pass array
li $ t4,0 #overall counter
li $ t5,0
li $ t6,0
循环: li $ v0,4 #system调用打印字符串 la $ a0,提示#load string 系统调用
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)失败数组中的#store字 addi $ t3,$ t3,4#t3 = t3 + 4(增量失败指针) addi $ t2,$ t2,1#t1 = t1 + 1(增量失败计数器)
l_end: addi $ t4,$ t4,1 #increment总计数器 bltu $ t4,15,循环#if t4&lt; = 15分支循环
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&lt; = t5分支到lp_a_end 系统调用#output单一分数
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 #if2&lt; = t5分支到lp_a_end 系统调用#output单一分数
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
答案 0 :(得分:3)
“似曾相识通常是黑客中的一个小故障”
很确定我已经看过这个:
MIPS program to determine pass/fail for test grades
编辑:一些建议:尽量简化。逐步构建程序。例如,尝试避免系统调用,使用硬编码输入来测试比较逻辑。然后,去系统调用。你正确使用数组吗?我已经看到你保留两个独立的计数器来索引数组,并保持其中元素的计数。我认为这很容易出错。也许你应该用计数器来索引数组(乘以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&lt; 50分支到其他(失败等级)
分支指令带有两个寄存器和一个标签。不注册,中级,标签
应该是:
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。
这就是我现在所能想到的。正如有人在dupe帖子(Rob Kennedy)中所说的那样,尝试询问你的导师,这就是为什么他得到报酬(我不是你的导师,只是伸出援助之手)。