2013-03-22 198 views
0

你好我一直在練習編寫彙編語言,我一直在研究這個看似簡單的代碼。我想提示用戶輸入,然後我想要輸入並將其放入數組中。然後我想打印出數組。我知道我可以將它們打印出來,而不用將它們放入數組中,但這僅適用於我的練習。有些東西雖然不會將它們打印出來,但並不正確。MIPS用戶輸入整數到數組然後打印出來

.data 
array: .space 400 
prompt: .asciiz "Enter an integer (0 to quit) :" 
text: .asciiz "After sorting, the list of integers is:" 
    .text 
    .globl main 
main: 
    la $a1, array 

    li $v0, 4 
    la $a0, prompt 
    syscall 

    li $v0, 5 
    syscall 

    sw $v0, 0($a1) 
    addiu $a1, $a1, 4 

    beqz $v0, sort 
    j main 

sort: 
    la $a1, $array 

    li $v0, 4 
    la $a0, text 
    syscall 

loop: 
    lw $t0, 0($a1) 
    addiu $a1, $a1, 4 

    beqz $t0, done 

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

    j loop 

done: 

請幫我解釋我做錯了什麼。哦,零點是我輸入零值時的基本值,這意味着它的輸入結束

回答

1

請記住,MIPS上的分支和跳轉指令具有延遲槽。也就是說,直接跟隨分支或跳轉指令的指令總是被執行。
插入NOPs或重新訂購說明,您的彙編程序(gas?)可能爲您處理此問題。你可以通過使用objdump反彙編來找出問題。如果彙編程序不是爲您解決這個問題,自行修復它的最簡單方法是在每次分支/跳轉後插入一個NOP

另一件突出之處是,在閱讀新號碼之前,您總是重新加載$a1的地址array。這意味着您讀取的每個數字將被存儲在array[0],包括終止0.因此,您的打印循環將作爲數組中的第一個值找到0並立即退出。
你可以通過更改代碼來解決這個問題:

main: 
la $a1, array 
read_numbers: 
    # Rest of code omitted for brevity... 
    beqz $v0, sort 
    j read_numbers 
+0

謝謝!這是在循環中加載地址的簡單錯誤。我甚至沒有意識到我正在那樣做。我很感激。 – user1836715 2013-03-22 14:09:04

相關問題