2012-02-22 13 views
1

私はMIPSアセンブリ言語を使い慣れていません。ちょうど学び始めた。私は、ユーザーが入力したテストスコアの文字グレードを表示する必要があるこの問題を抱えています。私はこれまでこれをしてきましたが、私はそれを働かせることはできません。私はいつもそれが想定されif文、論理AND、比較

無効または時々プログラムが終了したりできます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などの数を表示する必要があることです。これについてどうすればいいですか?私は別の登録簿で真であるときに各成績の数を記憶しなければならないことを知っています。

編集:私は

答えて

1

のWindows 7上のパート1をMARS 4.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:ときA、$ t2はB、...

+0

がそう、それは次の右に行くなければなりませんか?しかし、どこで書状を印刷するのですか? – Amjad

+1

両方ともfalseの場合は、文字を印刷します。印刷後、すべてのテストの最後にジャンプします。 – Patrik

+0

また、ユーザーが75を入力した場合、「75 is C」のように出力するにはどうすればよいですか? – Amjad

1
ちょうどゼロに$ T5に$ t1に初期化し、インクリメント$ t1の

あなたのロジックは逆向きです。 GE =以上で LEは、あなたが最も小さく始めて、あなたの方法を上に作業している場合また、あなたが本当にすべてで論理AND演算を必要としないOR EQUAL

LESS THANを=。

  • グレードIF == -1 THEN EndProgram
  • グレード< 60 IFグレード< 0 THEN THEN F
  • グレード< 70 THEN D
  • グレード< 80 THEN C IF IF
  • の場合にエラー
  • IFグレード< 90 THEN B
  • IFグレード< 100 THEN A
  • ;等級は両方ともfalseの場合よりも大きい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. 
+0

ありがとう、なぜ私はそれを考えなかったのですか?これがどのように行われたかの構文を共有できますか?また、ユーザが-1を入力するまでプログラムをループするには、 "j main"を正しい方法で使用していますか? – Amjad

+0

@HelloWorld - 問題を解決するには多くの正しい方法があります。しかし、ロジックの基本的な理解とMIPの命令の仕組みを理解することが最優先事項です。 –

+0

ああ、私はどこが間違っているのか分かります。 if文を翻訳する本の方法に従っていて、私は論理を乱した。分岐文が偽で実行された場合にのみ、次の行に移動します。 – Amjad

関連する問題