Assembly If语句、逻辑AND、比较

Assembly If语句、逻辑AND、比较,assembly,mips,mars-simulator,Assembly,Mips,Mars Simulator,我不熟悉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 [

我不熟悉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工具。

第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,…

您的逻辑向后。 GE=大于或等于 LE=小于或等于

另外,如果你从最小的开始,一路向上,你根本不需要逻辑AND运算符

  • 如果等级==-1,则结束程序
  • 如果等级<0,则为错误
  • 如果等级<60,则为F
  • 如果等级<70,则为D
  • 如果等级<80,则为C
  • 如果等级<90,则为B级
  • 如果等级<100,则A
  • );等级必须大于100所以 错误

谢谢,我怎么没想到呢!你能分享一下如何做到这一点的语法吗?同样要循环程序直到用户输入-1,使用“j main”是否正确?@HelloWorld-有很多正确的方法来解决这个问题。但是,基本了解逻辑和MIPs指令的工作原理应该是你的首要任务。啊,是的,我知道我错在哪里了。我按照书中的方法翻译if语句,把逻辑搞乱了。只有当分支语句为false时,它才会转到下一行并执行该语句。我的另一个问题是如何做到这一点:例如,如果用户输入75,我如何输出“75是C”?如何获得输出中的值?在Java和C中,这很简单,但在汇编中?所以如果两者都为false,则转到下一个,对吗?但是我在哪里打印字母等级?如果两者都是假的,那么你打印字母。打印完成后,跳到所有测试的末尾。另外,如果用户输入75,例如,我如何输出“75是C”?谢谢,但我必须一直循环,直到用户输入-1,那么我应该将这个循环放在哪里?就在两个测试之后。如果失败,他们将在失败后执行代码(因此,如果不小于90且不大于100,则执行)。整个循环应该放在整个程序的周围(基本上是j main),所以在打印之后,只需跳转即可。
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.