2014-10-09 98 views
0

所以,我的MIPS程序有用戶輸入3個整數,並從最小到最大的順序排列並打印出來。我的代碼如下:MIPS彙編程序不輸出正確的整數

.data 
prompt: .asciiz "Please enter an integer: " 

.text 
main: 
li $v0, 4 
la $a0, prompt 
syscall 

li $v0, 5 
syscall 
move $s0, $v0 


li $v0, 5 
syscall 
move $s1, $v0 


li $v0, 5 
syscall 
move $s2, $v0 


jal order3 


li $v0, 1 
move $a0, $s0 
syscall 

li $v0, 1 
move $a1, $s1 
syscall 

li $v0, 1 
move $a2, $s2 
syscall 

li $v0, 10 
syscall 

swap: 
move $t0, $s0 
move $s0, $s1 
move $s1, $t0 
jr $ra 

swap1: 
move $t0, $s1 
move $s1, $s2 
move $s2, $t0 
jr $ra 

order3: 
bgt $s0, $s1, swap 
bgt $s1, $s2, swap1 
bgt $s0, $s1, swap 
jr $ra 

問題是程序只打印出我輸入的第一個數字。例如,如果我輸入60,50,70作爲我的3個輸入,則輸出60個三次。我不知道爲什麼這樣做。我猜它與我的order3函數或我輸出這些值的方式有關。任何幫助,將不勝感激。

謝謝。

+0

QtSpim有一個單步按鈕和一個註冊查看器。我建議你用它們來發現問題。提示:你在幾個地方使用了錯誤的寄存器,你的'swap'子程序不會返回到'order3'子例程。 – Michael 2014-10-09 05:53:53

回答

0

您應該始終使用寄存器$ a0來通過系統調用打印一個整數。

li $v0, 1 
move $a0, $s0 
syscall 

li $v0, 1 
move $a0, $s1 
syscall 

li $v0, 1 
move $a0, $s2 
syscall 

看來早午餐(bgt)不保存指針返回。因此,最好使用這種類型的跳轉。

order3: 
blt $s0, $s1, next 
move $t0, $s0 
move $s0, $s1 
move $s1, $t0 

next: 
blt $s1, $s2, next2 
move $t0, $s1 
move $s1, $s2 
move $s2, $t0 

next2: 
blt $s0, $s1, fin 
move $t0, $s0 
move $s0, $s1 
move $s1, $t0 

fin: 
jr $ra