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.  

問題の 2 番目の部分は、ユーザーが -1 を入力した後、A、B などの数を表示する必要があることです。これについてどうすればよいですか?true の場合、各グレードのカウントを別のレジスタに保存し、インクリメントし続ける必要があることはわかっていますが、これがどのように行われるかはわかりません。

編集: Windows 7 で MARS 4.1 ツールを使用しています。

4

2 に答える 2

1

ロジックが逆になっています。GE = 以上 LE = 以下

また、最小のものから始めて上に向かっていく場合、論理 AND 演算子はまったく必要ありません。

  • IF グレード == -1 THEN EndProgram
  • IF グレード < 0 THEN エラー
  • IF グレード < 60 THEN F
  • IF グレード < 70 THEN D
  • IF グレード < 80 THEN C
  • IF グレード < 90 THEN B
  • IF グレード < 100 THEN 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 に答える
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 に答える