Если заявления, логическое И, сравнения - PullRequest
1 голос
/ 23 февраля 2012

Я новичок в ассемблере 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.  

Вторая часть проблемы заключается в том, что я должен отображать количество A, B и т. Д. После ввода пользователем -1.Как я могу пойти по этому поводу?Я знаю, что должен сохранять счет каждой оценки, когда он истинен, в отдельном регистре и продолжать увеличивать, но не уверен, как это сделать.

Редактировать: я использую инструмент MARS 4.1 в Windows 7.

Ответы [ 2 ]

1 голос
/ 23 февраля 2012

У вас есть логика в обратном направлении. GE = БОЛЬШЕ, ЧЕМ ИЛИ РАВЕН LE = МЕНЬШЕ, ЧЕМ ИЛИ РАВНЫЙ

Кроме того, вам вообще не нужен логический оператор AND, если вы начинаете с самого маленького и идете вверх.

  • ЕСЛИ оценка == -1 ТОЕ EndProgram
  • ЕСЛИ <0, ТО ошибка </li>
  • ЕСЛИ <60 ТО F </li>
  • ЕСЛИ <70, то D </li>
  • ЕСЛИ <80, то С </li>
  • ЕСЛИ <90, ТО B </li>
  • ЕСЛИ <100 ТОГДА А </li>
  • ; оценка должна быть больше 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.
1 голос
/ 23 февраля 2012

Часть 1:

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

Здесь вы проверяете, находится ли $ v0 между 90 и 100, а затем переходите к проверке B. Вы должны проверить, не находится ли он между 90 и 100:

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

Часть 2. Просто инициализируйте $ t1 в $ t5 в ноль и увеличивайте $ t1, когда A, $ t2, когда B, ...

...