MIPS:确定测试分数列表是否通过/未通过

时间:2009-05-04 03:30:39

标签: list math mips

我正在编写一个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

1 个答案:

答案 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)中所说的那样,尝试询问你的导师,这就是为什么他得到报酬(我不是你的导师,只是伸出援助之手)。