2012-02-22 105 views
1

我是MIPS彙編語言的新手。剛開始學習。我有這個問題,我必須顯示用戶輸入的測試分數的字母等級。到目前爲止,我已經完成了這項工作,但我無法完成這項工作。我始終保持了無效或有時在節目結束或給予D.如果語句,邏輯AND,比較

假設:

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

回答

1

1部分:

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

在這裏,你測試是否$ v0爲90和100之間,然後跳轉到checkB。你必須檢查,如果它不是100之間90:

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

第2部分:只初始化$ T1到T5 $零和增量$ T1當A,$ T2時B,...

+0

所以如果兩個都是假的,然後它去旁邊一個?但是我在哪裏打印信件等級? – Amjad 2012-02-23 13:44:50

+1

如果兩者都是錯誤的,那麼你打印這封信。打印完成後,跳到所有測試的結尾。 – Patrik 2012-02-23 13:47:25

+0

另外,如果用戶輸入75例如,我怎麼輸出像「75是C」? – Amjad 2012-02-23 13:57:18

1

你有你的邏輯倒退。 GE =大於或等於 LE =小於等於

另外,如果從最小值開始並按照自己的方式工作,您根本不需要邏輯AND運算符。

  • IF級== -1 THEN EndProgram
  • IF <級0 THEN錯誤
  • IF級< 60則f
  • IF級< 70 THEN d
  • IF級< 80則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. 
+0

謝謝,我爲什麼沒有想到這一點!你能分享這個過程的語法嗎?也循環程序,直到用戶輸入-1,正確使用「j main」? – Amjad 2012-02-23 13:37:56

+0

@HelloWorld - 有很多正確的方法來解決這個問題。但是對於邏輯和MIPs指令的工作原理有一個基本的瞭解應該是你的首要任務。 – 2012-02-23 14:08:07

+0

啊,是的,我知道我錯了什麼地方。我一直在關注這本書的翻譯方法,如果陳述和我搞砸了邏輯。只有在分支語句爲false且執行該語句時才轉到下一行。 – Amjad 2012-02-23 14:12:59