1

我是 MIPS 汇编语言的新手。刚开始学。我遇到了这个问题,我必须为用户输入的测试分数显示一个字母等级。到目前为止,我已经做到了,但我无法让它发挥作用。我总是变得无效,或者有时程序结束或给出 D。

假设:

Score Range Letter Grade 
90 to 100 A 
80 to 89 B 
70 to 79 C 
60 to 69 D 
0 to 59 F 

请帮我弄清楚我做错了什么并更正我的代码!

.data

prompt: .asciiz "Enter a test score [0 to 100] or -1 to stop: "
invalidPrompt:  .asciiz "Invalid \n"
A:  .asciiz "A \n"
B:  .asciiz "B \n"
C:  .asciiz "C \n"
D:  .asciiz "D \n"
F:  .asciiz "F \n"

.globl main
.text

main:
    li $v0, 4
    la $a0, prompt
    syscall

    li $v0, 5
    syscall
    #move $a1, $v0

    beq $v0, -1, end    # -1 to stop

checkA:              
    bge $v0, 90, checkB
    ble $v0, 100, checkB
    li $v0, 4
    la $a0, A
    syscall
#    j main

checkB:       
    bge $v0, 80, checkC
    ble $v0, 89, checkC
    li $v0, 4
    la $a0, B
    syscall 
 #   j main

checkC:    
    bge $v0, 70, checkD
    ble $v0, 79, checkD 
    li $v0, 4
    la $a0, C
    syscall 
#    j main

checkD:    
    bge $v0, 60, checkF
    ble $v0, 69, checkF 
    li $v0, 4
    la $a0, D
    syscall 
#    j main  

checkF:    
    #bge $v0, 0, invalid
    ble $v0, 59, end
    li $v0, 4
    la $a0, D
    syscall 
#    j main

invalid:    
    blt $v0, 0, end
    bge $v0, 100, end
    li $v0, 4
    la $a0, invalidPrompt
    syscall
#    j main                                          
j main

end:

#--- TERMINATE ---
      li $v0, 10       # terminate program run and
      syscall          # return control to the OS.  

问题的第二部分是我必须在用户输入 -1 后显示 A、B 等的数量。我该怎么办?我知道我必须将每个等级的计数存储在一个单独的寄存器中并不断增加,但不确定这是如何完成的。

编辑:我在 Windows 7 上使用 MARS 4.1 工具。

4

2 回答 2

1

第1部分:

checkA:              
bge $v0, 90, checkB
ble $v0, 100, checkB

这里你测试 $v0 是否在 90 和 100 之间,然后跳转到 checkB。您必须检查它是否不在 90 和 100 之间:

checkA:              
ble $v0, 90, checkB
bge $v0, 100, checkB

第 2 部分:只需将 $t1 初始化为 $t5 为零,然后在 A 时增加 $t1,在 B 时增加 $t2,...

于 2012-02-22T22:35:22.400 回答
1

你有你的逻辑倒退。GE = 大于或等于 LE = 小于或等于

此外,如果您从最小的开始并逐步向上,那么您根本不需要逻辑 AND 运算符。

  • IF 等级 == -1 THEN EndProgram
  • IF 等级 < 0 THEN 错误
  • 如果等级 < 60 那么 F
  • 如果等级 < 70 那么 D
  • 如果等级 < 80 那么 C
  • 如果等级 < 90 那么 B
  • 如果等级 < 100 那么 A
  • ; 等级必须大于 100 所以错误
main:
    li $v0, 4
    la $a0, prompt
    syscall

    li $v0, 5
    syscall
    #move $a1, $v0

    beq $v0, -1, end    # -1 to stop

    ble $v0, 0, invalid 

checkF:
    bge $v0, 60, checkD
    li $v0, 4
    la $a0, F
    syscall
    j main
checkD:
    bge $v0, 70, checkC
    li $v0, 4
    la $a0, D
    syscall
    j main
checkC:
    bge $v0, 80, checkB
    li $v0, 4
    la $a0, C
    syscall
    j main
checkB:
    bge $v0, 90, checkA
    li $v0, 4
    la $a0, B
    syscall
    j main
checkA:
    bge $v0, 101, invalid
    li $v0, 4
    la $a0, A
    syscall
    j main
invalid:    
    li $v0, 4
    la $a0, invalidPrompt
    syscall

    j main

end:

      li $v0, 10       # terminate program run and
      syscall          # return control to the OS.
于 2012-02-23T13:23:34.777 回答